目录
1.TCP报文
标志位含义:
- URG:紧急标志,该位为"1"时有效。
- ACK:确认标志,表示确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
- PSH:推标志。
- RST:复位标志,用于复位相应的TCP连接。
- SYN:同步标志,表明同步序列编号栏有效,仅在三次握手建立TCP连接时有效。(建立一个新的连接)
- FIN:结束标志。(断开一个连接)
2.三次握手
2.1 三次握手的目的
为了防止已失效的连接请求报文字段突然又传送到服务端,因为产生错误。
2.2 三次握手的流程
第一次:
客户端向服务端发送一个请求,需要建立连接,此时SYN=1,产生seq为随机值t,客户端进入SYN_SENT状态,等待服务器确认。
第二次:
服务端接收到请求,可以建立连接,此时向客户端返回SYN=1,ACK=1,产生seq为随机值k,ack=t+1,服务端进入SYN_RCVD状态,等待客户端确定。
第三次:
客户端收到服务端返回的响应,检查ACK=1,及ack=t+1,检查无误,向服务端发送ACK=1,ack=k+1。发送成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,成功建立连接。
3.四次挥手
3.1 四次挥手的流程
注释:等待时间(2MSL)--2倍的报文最大生存时间
MSL(Maximum Segment Lifetime),即“报文最大生存时间”,任何报文在网络中存在的最长时间,超过该时间,报文将会被丢弃。
3.1.1 问:为什么需要等待2MSL?
当主动发起关闭方发送完最后一个ACK包后无法确认对方是否有收到这个ACK包,所以2MSL的时间能保证如果对方没收到会重发第三次挥手的FIN包,且这个包有足够的时候发送回来。
如果在这个时间内还没收到重发的FIN包,便可以证明对方已收到该ACK包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
3.1.2 为什么是三次握手四次挥手?
服务端收到客户端的SYN连接请求报文后,可直接发送SYN+ACK报文。其中ACK代表应答, SYN代表同步的。
而关闭连接时,当服务端收到FIN报文后,极可能不会立即关闭SOCKET,因此只能先回复ACK报文,通知客户端我已收到请求,等到所有的报文发送结束,服务端会发送FIN报文。因而,不能同时发送,需要四步挥手。