TCP 传输控制协议

March 22, 2016

计算机网络

TCP ( Transmission Control Protocol 传输控制协议) 是一种面向连接的,可靠的传输层通信协议,IEFT定义 RFC 793.

TCP 和 UDP 一起,处于传输层,位于 IP 层之上,应用层之下。IP 层是无连接的,不可靠的协议,那么 TCP 又是怎么可靠传输的呢。

面向连接

建立连接需要三次握手。

  • 客户端发送 SYN 报文给服务端;
  • 服务端接受到 SYN 后,回应一个 SYN + ACK 报文;
  • 客户端收到 SNY + ACK 报文后,回应一个 ACK 报文;

这个时候,连接就建立了,可以开始传输数据了。

第一次 SYN 报文表示发送方要和接收方建立连接。SYN + ACK 表示接收方同意和发送方建立连接,并且也请求和发送方建立连接,最后的 ACK 表示发送方同意建立连接。

断开连接需要四次握手:

  • 其中一方发送 FIN 报文,表示我已经没话可说了;
  • 接受方收到 FIN 报文后,回应 ACK 报文;
  • 接受方收到 FIN 报文后,也回应 FIN 报文,表示我也没话可说了;
  • 发放放接收到 FIN 报文后,也回应一个 ACK 报文。

接受方收到 FIN 报文后,ACK 和 FIN 报文可能同时发送,也可能分开发放。分开发送的情况是这样的,你没话说了,我还有话说呢。
第一个 FIN 报文可以由任意一方发起。
第一个 FIN 报文可能随着最后一个数据包一起发送,也就是不一定是单独发送的。

三次握手和四次握手的设计并不是为了可靠传输设计的,而是面向连接设计的。因为 IP 协议是不可靠的,所以当发送方有一坨数据想要发送给接收方的时候,先使用代价比较小的几个报文,先探探路,比如三次握手的第一个 SYN 报文,如果这个报文能正确到达接收方,表示连接是通的,至少目前是通的,如果因为网络拥堵,发送方没有在预定的时间内收到 SYN + ACK 的相应,它会进行一定次数的重发,当超出重发次数后,就认为接收方是不可到达的,就放弃了这次请求,然后告诉应用层。当接收方接收到 SYN 后,发出 SYN + ACK 报文,并且开始准备接受数据,如果发送方一直没有相应一个 ACK 报文的话,它也会重复一定的次数,如果超出了次数,那么表示连接断开了,接受方就需要回收资源了。

四次握手也是类似的设计,当一方发送 FIN 给另一方的时候,接受方就知道发送方不会再发送数据了,可以把接受到的所有数据组装交给应用层了,同时也告诉应用层,数据接收完成了。但是不代表接收方一定要同时发送 FIN 报文,如果还有数据包发送,那么就接着发送,发送完了再发 FIN 报文。

可靠传输

TCP 为了保证可靠传输,做了几个规定。

  1. 接收方收到信息后,需要发送一个确认消息。
  2. 发送方如果在规定时间内没有收到接收方的确认消息,会尝试一定次数的重发,直到收到确认消息或者超出重试次数。
  3. 如果超过重发次数,通知 TCP 的上层,消息发送失败。
  4. TCP 会把上层递交的数据进行拆分和打包,并且给每个 TCP 数据包定义一个 id,接收方可以发送消息通知发送方重发某个数据包。
  5. 接收方完成所有数据包的接收和校验后,才会递交给上层协议。

--- EOF ---

添加新评论