TCP连接的建立与释放

TCP是面向连接的,在传输报文段之前先要建立连接。发起连接请求的一方叫客户端,响应连接请求的一方叫服务端

三次握手






第一次握手:
客户端向服务端发送请求连接报文(SYN);其中报头控制位SYN=1,初始序号seq=x。并进入SYN_SENT状态,等待服务器确认;
第二次握手:
服务端收请求连接报文(SYN)后,向客户端发送确认报文(SYN+ACK)。确认报文段的首部中,ACK=1、SYN=1。确认序号:ack=x 1,同时为自己选择一个初始序号seq=y。此时,服务器进入SYN_RCVD状态;
第三次握手:
客户端收到服务器的确认报文(SYN+ACK)后,还要再向服务端发送一个确认报文(ACK)。该确认报文段首部中,ACK=1,确认号是ack=y 1,自己的序列号是seq=x 1。此包发送完毕,客户端进入ESTABLISHED状态,服务端收到确认报文后,也进入ESTABLISHED状态。
至此TCP连接建立。
三次握手过程中传送的包里不携带数据。三次握手完毕后,客户端与服务端才正式开始传输数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次挥手





断开一个TCP连接则需要“四次挥手”。
此处,客户端——主动关闭方,服务端——被动关闭方。
第一次挥手:
此时两端还都处于ESTABLISHED状态,客户端停止发送数据,并发送一个请求断开连接报文(FIN)。
该报文首部中,FIN=1,序列号seq=u。
服务端接收到请求报文后,进入CLOSE_WAIT(关闭等待)状态。
也就是告诉服务端,我的数据发送完了,不会再给你发数据了。
(另,在FIN包发送之前发送出去的数据,如果没有收到服务端对应的ACK确认报文,主动关闭方依然会重发这些数据);此时,客户端还可以接受数据。
第二次挥手:
服务端收到请求断开连接报文(FIN)后,回复确认报文(ACK),确认号:ack=u 1,序列号seq=v。
客户端收到确认报文(ACK)后,进入FIN-WAIT-1(终止等待-1)状态。
现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
第三次挥手:
服务端发送一个请求断开连接报文(FIN),用来终止服务端到客户端的数据传送。
该报文段首部中,FIN=1,ACK=1,确认序列号ack=u 1,序列号seq=w。
客户端接收到确认断开连接报文(ACK、FIN)后,进入FIN-WAIT-2(终止等待-2)状态。
也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。
第四次挥手:
客户端收到确认断开连接报文(ACK、FIN)后,回复确认报文(ACK)给服务端。
确认序号ack=w 1。序列号=u 1。
然后进入TIME_WAIT(时间等待)状态。

注意:
此时,TCP连接还没有被释放,需要时间等待状态结束后(4min),两端才会进入CLOSED状态。
设置时间等待是因为——最后一个确认报文(ACK)可能会丢失,而需要重传。

#面经#
全部评论
赞👍
点赞 回复 分享
发布于 2019-03-25 09:18

相关推荐

10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
点赞 34 评论
分享
牛客网
牛客企业服务