现在的位置: 首页 > 综合 > 正文

socket中TCP建立连接与释放连接

2018年12月17日 ⁄ 综合 ⁄ 共 849字 ⁄ 字号 评论关闭

TCP建立连接需要“三次握手”

  1. 客户端想服务端发送连接请求,并发送SYN包(syn = j),并置状态为SYN_SEND状态,并等待服务端响应。
  2. 服务端接收到SYN包,需要确认客户端的SYN(ack = j+1), 同时发送自己的一个SYN包(syn = k),即发送SYN+ACK包,并置状态为SYN_RECV。
  3. 客户端收到服务端SYN+ACK包,并发送确认包ACK(ack = k + 1),之后服务端与客户端同时置状态为ESTABLISHED,自此三次握手结束。

三次握手协议后可以建立起安全的全双工连接。为什么要三次握手呢?第一次是需要客户端发起一个建立连接的请求,第二次是服务端响应客户端,

以确保服务端可正常通信,第三次是服务器需要客户端回应,确保客户端可以正确响应。

上述的ack表示期望下次对方传递的数据的序列,所以实在SYN的基础上+1.

关于快速重传,在收到一个失序的报文,TCP需要重新传输ACK(与上一个ACK重复),这个ACK只是希望告知对方自己收到一个失序的报文,并且告知需要的报文序号。

对于收到重复的ACK,可能是丢包或者报文失序,如果是报文失序,在收到1-2个重复的ACK基本上就能收到失序的报文,而如果是3个及以上重复ACK,可以认定为丢失,

需要立即重传,这就是快速重传机制。

TCP断开连接的“四次挥手”

  1. 客户端发送FIN给服务端。
  2. 服务端接收到数据后发送ACK确认。
  3. 服务端向客户端发送FIN,并关闭连接。
  4. 客户端发送确认包ACK给服务器

从图中可以看出,在服务端接收到ACK后状态改为CLOSED,而客户端在2MSL后也把状态置为CLOSED。

为什么建立连接要3次握手,但是断开要4次?

服务端socket在listen状态下在收到SYN报文建立连接请求时,SYN+ACK可以放在同一个报文发送过来。在关闭连接时,对方发送过来的FIN只是表示对方没有数据

在发送过来,但是服务端还有可能需要向客户端发送数据,所以,服务端之后也需要发送FIN到客户端来表示关闭连接。所以这里的ACK报文与FIN报文是分开发送的。

【上篇】
【下篇】

抱歉!评论已关闭.