下图为TCP头部里面部分信息,入下标志位,每个标志位占一位。
标志位这里会涉及3个,ACK SYN FIN
ACK:确认序号有效。 SYN:发起一个新连接。 FIN:释放一个连接。
2 三次握手过程
第一次握手
Client将标志位SYN置1,随机产生一个值seq=J,并将数据包发给Server
第二次握手
Server将标志位SYN和ACK都置1,随机产生一个值,并将数据包发给Client确认连接请求
第三次握手
Client收到确认后若ACK为1,则将该数据包发送给Server,Server检查ACK为1则连接建立成功,可以传输数据
3 为什么不是两次和四次握手
四次握手也可以,显得很多余,没必要。
两次握手可能会出现已失效的请求报文段突然又传送到了服务端而产生连接的误判。
4 四次挥手过程
第一次挥手:
Clien发送一个FIN,用来关闭Client到Server的数据传送,
第二次挥手:
Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:
Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。
5 为什么挥手需要四次
tcp连接握手时ACK是和SYN一起发送,4次挥手的时候ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。