TCP三次握手和四次挥手 | 如今琴声幽幽我的等候你没听过
Cobb 716 1

TCP的那些事儿

客户端:client
服务端:server

Tcp三次握手:

TCP三次握手和四次挥手 | 如今琴声幽幽我的等候你没听过

声明: 三次握手是为了建立连接,不是为了可靠传输。 可靠传输:是有很多可靠传输的机制,例如超时重传、序列号,每发一个包都要有响应,一定的时间内没有响应就超时重传

三次握手的原因:

Tcp是面向连接的通信,通信之前要先建立连接,所以要三次握手。UDP不需要握手,因为不需要建立连接。 为什么要三次握手? 防止client在申请连接的时候,SYN包由于网络阻塞,在网络中停留的时间长,这时候client长时间没有得到SYN的ack,client已经close。
如果两次连接就成功,server就会生成和client通信用的fd,但实际上client已经close了。 server再发SYN是检测client是否正常存活,如果存活,client又会相应ack,server判断client正常在线,所以server就会把fd从半连接队列中放到全连接队列中。

开始握手连接:

  1. client发送一个SYN包,进入SYN_SENT状态,
  2. server接收到SYN,进入SYN_RCVD状态,(有一个半连接队列,里面也有fd,如果半连接队列连接成功,会把fd拿到全连接队列/监听队列中,),服务器回应相应的ack,还发了SYN,
  3. client给server的SYN回应相应的ack,收到以后client和server都进入ESTABLISHED(连接建立)状态。

备注:建立连接后,服务器中就有了监听队列,由内核负责的,在监听队列中放fd文件描述符,用来和指定的client通信,在代码上用accept()函数,从监听队列中取出对应的fd,和连接server的client进行通信

Tcp四次挥手:

TCP三次握手和四次挥手 | 如今琴声幽幽我的等候你没听过

声明: client和服务器,任意一端都可以进入挥手的状态 注意: FIN是报文,报文是有格式的,报文里有字段记录报文序号seq,不会让报文产生混乱。 为什么需要四次挥手? 因为TCP是基于连接通信,通信结束需要拆连接,所以需要四次挥手。

开始挥手告别:

1.client发送FIN包,表示不再发送数据,进入FINT_WAIT_1状态, 2.server收到包,进入CLOSE_WAIT状态,响应ack(client进入入FINT_WAIT_2状态),知道client不再发了,但是继续接收, 3. server端收完以后给client发一个FIN包,告诉clientserver收完了(server进入LAST_ACK状态) 4. client立刻进入TIME_WAIT状态,2MSL 两倍的最大报文段在网络中的生存时间,有可能发生阻塞,所以报文在网络中超过最大的报文网络生存时间,网络中的报文被丢弃了。 在TIME_WAI时间内,client给服务器回应ack,服务器就正常关闭了,client正常CLOSE.

TIME_WAIT状态

  1. 能够尽力保证server收到最终的ACK进入正常的close流程 ----------解释:如果client关掉了,服务器没有收到ack响应,服务器超时重传(TCP可靠连接的重要保证),来回几次,client都没有响应,就产生了丢包。 报文发来 -> 网卡 -> 网络层 -> 传输层tcp -> 应用层, 到了tcp层的时候,发现端口已经close掉了,所以就没有到应用程序。直接给FIN返回一个RST包,server就进入异常处理流程了。
  1. TIME_WAI的时间,保证网络延迟的报文到达或者被丢弃。 ---------- 解释:由于网络环境复杂,server给client发送的数据报文可能阻塞,如果没有TIME_WAI,马上close掉, 另外一个应用程序又直接绑定了主机的端口号,一上来就会接收到上次给这个端口号发的在网络中残留的数据包, 那么为什么要等待2MSL? 在这个时间内就可以保证在网络上传输的数据,由于阻塞还没有到达这一端的数据报文,超过了最大生存时间,在网络上被丢弃,另外,2MSL时间到了TIME_WAI关闭后,新程序就不会收到上一次发送的数据。
评论区

索引目录