三次握手:
1、c 向 s 发送 SYN 新建连接标志 1,seq 序列号为 x
2、s 向 c 发送 SYN 新建连接标志 1,ACK 确认标志 1,seq 序列号 y,ack 确认号 x+1
3、c 向 s 发送 ACK 确认标志 1,seq 序列号 x+1,ack 确认号 y+1
四次挥手:
1、c 向 s 发送 FIN 关闭连接标志 1,seq 序列号为 x
2、s 向 c 发送 ACK 确认标志 1,seq 序列号为 y,ack 确认号 x+1
3、c 向 s 发送 FIN 关闭连接标志 1,ACK 确认标志 1,seq 序列号 w,ack 确认号 x+1
4、s 向 c 发送 ACK 确认标志 1,seq 序列号 x+1,ack 确认号 w+1
关键字段解析:
(1)序号:seq序号,占32位,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,占1位,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
———————1、URG:紧急指针(urgent pointer)有效。
———————2、ACK:确认序号有效。
———————3、PSH:接收方应该尽快将这个报文交给应用层。
———————4、RST:重置连接。
———————5、SYN:发起一个新连接。
———————6、FIN :释放一个连接。
常见问题:
1、为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为有可能在客户端发送关闭请求的时候,服务端的数据还没有发送完毕,所以只能先发送一次确认标志的报文,表示你的关闭请求我已经收到,但是我还有数据待发送,还不能关闭,只有等到所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。
2、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
因为虽然客户端收到了服务端的关闭报文,并且发送了确认报文给服务端,但是有可能确认报文因为某些原因发送失败,导致服务端没有收到确认报文,服务端就会一直重复发送关闭报文,等待客户端返回确认报文。 所以必须确认服务端收到了确认报文,Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
3、为什么不能用两次握手进行连接?
三次握手是为了确认双方都已准备好进行连接,如果只有两次握手的话,那么只能单方面确认已准备就绪。
4、如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。