【TCP】TCP 三次握手连接&四次握手断开

#TCP建立连接
TCP/IP 是一个可靠的全双工连接服务,采用三次握手建立连接

第一次握手:客户端C向服务端S发送SYN包(首位为1,含默认序号x)
第二次握手:服务端S在接收到客户端C的SYN包之后,如果同意连接,那么向客户端发送确认SYN包(首位为1,确认号为x+1, 同时包含自己的默认序号y)
第三次握手:客户端C在接收到服务器S的确认包之后,发送确认包给服务器(首位为1,确认号为y+1),并在客户端通知上层已经建立连接, 服务器在接收到客户端的确认消息的时候通知上层应用已经建立连接,TCP建立连接完成
TCP连接示意图

#TCP四次握手断开
TCP是一个全双工的连接, 所以断开的时候需要两个方向分开断开, 原则:一个方向没有数据流动时候发送FIN包断开这个方向的连接。
关闭原则 : 先关闭写通道,后关闭读通道
【1】 客户端发送FIN来断开 客户端C和服务器方向的连接(关闭客户端向服务器的写通道)
【2】 服务器端确认断开连接 向客户端发送确认消息(关闭客户端向服务器的读通道)
【3】 服务器端发送FIN来断开 服务器和客户端方向的连接(关闭服务器的向写通道)
【4】 客户端确认断开连接,向服务器端确认(关闭服务器向客户端的读通道)
这里写图片描述

#Close-Wait
TCP的Close状态出现在被动关闭方(不一定是服务器),出现的时间在接收到主动关闭方的FIN而自身未发送 ACK, 如果出现大量的 close-wait需要检查服务器代码
#Time-Wait
TCP关闭的主动方在接受到FIN之后再等待2MSL(windows大概240S)后再关闭
原因
【1】防止IP通信不稳定,如果直接Close, 如果服务器没有接收到客户端的Close-Wait,再次向客户端发送FIN, 此时客户端已经关闭,则返回的是RST,服务端会把这个错误交到高层。
【2】防止原来的数据影响下次通讯, 如果主动方直接Close, 并且向服务器重新发送另外一个请求,虽然说端口不一定相同, 但是如果相同的话,原来的socket中滞留的数据,在建立连接之后发送到服务端, 这样会造成数据混肴,所以TCP要等待 2MSL之后关闭连接。

经过千锤百炼出来的各种协议,每一处设计都有它的巧妙的体现!!!!!!!!!!!!

发布了86 篇原创文章 · 获赞 15 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览