目录
一.TCP的连接建立
1.1面向连接
1.2TCP报文结构
1.3TCP三次握手
1.4TCP的状态变化
1.5为什么必须是三次握手,而不是两次或者四次
二.TCP的连接断开
2.1TCP的"四次挥手
2.2TCP的状态变化
2.3为什么要有TIME_WAIT状态
2.4为什么TIME_WAIT状态的时间是2MSL
一.TCP的连接建立
1.1面向连接
面向连接:在发送数据前,需要先建立一条点到点的连接
点到点:只有双方进行通信
连接:双方前协商的一系列约定
TCP四元组:
源IP地址 | 源端口号 |
目标IP地址 | 目的端口号 |
可以唯一区分和标识一条TCP连接
1.2TCP报文结构
序列号:TCP是基于"字节流"的协议,定义为字节流的编号
确认序列号:发送方发送的下一个字节的序号
头部长度:最短20个字节,变长头部
1.3TCP三次握手
SYN报文:客户端向服务器发送请求建立连接的信号
-
客户端发送SYN包:客户端向服务器发送一个SYN包,其中包含客户端的初始序列号以及请求建立连接的标志位。
-
服务器回复SYN-ACK包:服务器接收到客户端的SYN包后,会回复一个带有SYN和ACK标志的包,其中SYN标志表示同意建立连接,ACK标志表示确认客户端的SYN包已经收到,同时还会告知自己的初始序列号。
-
客户端回复ACK包:最后,客户端会回复一个带有ACK标志的包,其中ACK标志表示确认服务器的SYN-ACK包已经收到,连接已经建立成功。
1.4TCP的状态变化
客户端:
1.关闭状态: 在发送SYN请求建立连接之后,进入到下一个状态
2.SYN_SENT :客户端等待服务器返回SYN_ACK报文
3.建立完成:收到服务器返回的SYN_ACK报文,因为此时客户端指向服务器的会话 已经 建立完成
客户端发送给服务器的最后一个ACK报文,是允许携带数据的
服务器:
1.关闭状态:当服务器应用程序创建一个监听的套接字之后,将进入到下一个状态
2,Listen(侦听状态):当接收到客户端发送的SYN报文之后,为TCP连接分配缓存空 间,同时,发送SYN_ACK报文段,进入到下一个状态
3,SYN_RCVD状态:等待客户端回复ACK,收到之后,将进入到下一个状态
4,建立完成状态
1.5为什么必须是三次握手,而不是两次或者四次
为什么不是两次握手
为什么不是两次握手
三次握手可以防止旧的重复连接造成混乱
二.TCP的连接断开
2.1TCP的"四次挥手
2.2TCP的状态变化
客户端:
建立完成状态 --- 发送完所有字节流后,携带最后一组字节流的数据段同时将FIN标记位置 1,之后,进入到下一个状态
FIN_WAIT_1 --- 等待服务器回复ACK,收到ACK应答之后,将进入到下一个状态
FIN_WAIT_2 --- 等待服务器发送FIN断开请求,将回复ACK进行确认,进入下一个状态
TIME_WAIT --- 等待2MSL时间后进入下一个状态
CLOSE --- 关闭状态,断开TCP的连接,释放掉所有TCP连接
服务器:
建立完成状态 --- 收到客户端发送的FIN断开请求后,服务器将回复一个ACK确认报文,之 后,进入到下一个状态
CLOSED_WAIT --- 等待服务器自身字节流的发送,当自身所有字节流传递完毕后,将发送一个 FIN断开请求,之后进入到下一个状态
LAST_ACK --- 等待客户端进行最后的ACK应答,当收到客户端发送的ACK确认报文之后,将进
入到下一个状态
CLOSE --- 关闭状态,断开TCP的连接,释放掉所有TCP连接占用的资源
2.3为什么要有TIME_WAIT状态
保证TCP会话可以正常关闭
2.4为什么TIME_WAIT状态的时间是2MSL
MSL -- 报文最大生存时间
设置为2MSL时间的原因:
1,最后一个ACK报文丢失,等待对方重传,一来一回正好两个MSL时间,设置为此,则可以 保证TCP会话的正常断开
2,设置2MSL,足以让两个方向上的数据报都丢弃,再出现新的连接时,不至于被历史报文 造成数据错乱
3,太长也不行,导致资源占用过大