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

相关推荐

不愿透露姓名的神秘牛友
昨天 19:30
化身华黑 今天询问对接人审批情况,结果被告知没HC了 云计算 
苦闷的柠檬精allin实习:主管面结束后hr每周保温一次,结果前几天和我说没hc了,我也化身华黑子了
投递华为等公司8个岗位 > 华为求职进展汇总
点赞 评论 收藏
分享
一tiao酸菜鱼:秋招还没正式开始呢,就准备有结果了。。。。?
点赞 评论 收藏
分享
炫哥_:哥们项目描述里面vector和mysql之类的都要写吗,直接开头技术栈巴拉巴拉就行了,完全不是技术点啊
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-12 18:53
第一次听说还有无水工作!!!又是被刷新三观的一天
Lynn012:666第一次听到,你给他说这里不方便我们加个微信
点赞 评论 收藏
分享
评论
点赞
34
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务