Open fangmd opened 3 years ago
给数据包添加 IP相关数据(协议头)
给数据包添加:以太网相关数据
客户端发送SYN请求,进入 SYN_SEND 状态
服务器收到请求,给客户端发送 ACK,服务器进入 SYN_RECV 状态
客户端收到 ACK, 客户端发送ACK, 客户端和服务器都进入 ESTABLISHED 状态。
作用:处理失效连接,防止资源浪费。
TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。
三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
为什么不是4次? 4次也可以,不过2,3可以合并所以就只有3次了,可以提高效率(2组 SYN+ACK)
客户端发送 FIN, 进入 FIN_WAIT_1 状态
服务器收到FIN, 回复 ACK, 客户端进入 FIN_WAIT_2 状态,
服务器发送 FIN, 进入 LAST_ACK 状态
客户端收到FIN, 回复 ACK, 进入 TIME_WAIT 状态,服务器收到FIN后关闭连接,客户端等待2MSL后关闭
为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态? 为了保证B能收到A的确认应答。 若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
为什么要4次? (1)第一次挥手 因此当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
(2)第二次挥手 被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)。
(3)第三次挥手 被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。
(4)第四挥手 如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态。
7层模型:
参考: