TCP 协议概览

背景知识——互联网分层模型

  1. 应用层(DNS,FTP,HTTP,RTSP,SSH,TLS/SSL, XMPP, DHCP...)
  2. 传输层(TCP,UDP...)
  3. 网络层(IP,...)
  4. 链路层(ARP,...)
  5. 实体层

另外,也有将互联网分为7层的说法,他们分别是:应用层、
表示层(提供数据格式或转换服务。比如:加密与解迷,编码与解码,压缩与解压)、
会话层(为客户端的应用程序提供了打开、关闭和管理会话的机制)、
传输层、网络层、数据链路层、物理层。

TCP 是什么?

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流(byte stream)的传输层通信协议;
TCP 基于不可靠的 IP 协议,提供稳定、可靠的数据传输服务;
对于 TCP 需要知道的是,TCP 所处的第2层传输的数据叫 Segment,IP 所处的第3层传输的叫 Datagram, 第4层传输的数据则叫做 Frame;
数据从应用层往下传输,每经过一层都会在数据头部被加上一个 header ,层层封装;
反之,则需要层层解封,最后应用层才能取得数据。

TCP 特性

  1. 点对点协议
  2. 可靠
  3. 管道传输(同时送多个segments)
  4. sender & receiver 都有 buffer
  5. byte stream
  6. 双向传输
  7. 面向连接(oriented connection)
  8. 重传机制

TCP segment 结构体(这个非常重要)

TCP 协议概览_第1张图片
tcp-segment.png
  • source port:源 Application 端口号
  • dest port:目标 Application 端口号

TCP 三次握手(如何建立连接?)

  1. Client 传送一个 SYN segment 给 Server(init sequence number)
  2. Server 收到 SYN,回一个 SYNACK segment 给 Client(alloc buffer; init sequence number)
  3. Client 收到 SYNACK,再回一个ACK,从此连接才算是建立完成(同时,可以带上 data 做数据传输)

TCP 为什么需要三次握手?

TCP 协议概览_第2张图片
tcp_why.jpeg

TCP 四次分手(如何关闭连接?)

  1. client 传送一个 FIN segment 给 server,请求关闭连接
  2. server 回一个 ack 给 client,表示 client 可以关闭连接了
  3. server 再发一个 FIN segment 给 client,请求关闭连接
  4. client 回一个 ack 给 server,表示 server 可以关闭连接,server 收到 ack ,关闭连接。此时,client 等待2MSL后依然没有收到回复,则证明 server 端已正常关闭,那好,client 也可以关闭连接了。


    TCP 协议概览_第3张图片
    tcp_close.png

TCP 为什么需要四次分手?

简单来说,因为 TCP 连接是双向的,所以 sender 需要发送 FIN 征求 server 的同意;随后,server 收到 client 的请求,给 client 回复 ack,告诉它,此时可以关闭连接;而 server 同时也需要通知 client ,告诉它自己不会再传输数据了,所以,server 给 client 发送 FIN 信号;最后,client 收到 server 的请求, 回复 ack 表示同意。

TCP 如何保证数据传输是可靠的?

  1. 给 byte stream 编号
  2. receiver 校验数据的正确性
  3. receiver 回复 ack
  4. timer. 发生 timeout 时,重传

TCP 重传机制

为什么会重传?
1. 丢失 ack
Host A 给 Host B 传输 数据, 随后 Host B 给 A 回复 ack, 但由于网络原因,这个 ack 在传输过程中 loss 了, 那么经过一个 timeout 时间后,Host A 给 Host B 重新传送这份数据。
2. timeout
Host A 给 Host B 传输数据, 随后 Host B 给 A 回复 ack ,但由于网络延迟,这个 ack 在一个 timeout 时间内没有被及时送给 Host A,经过一个 timeout 时间后,重送数据,并且在收到延时的 ack 后, 按实际收到的数据回复 ack
3. 收到3次重复的 ack
由于 receiver 回复给 sender 的 ack 序列号表示期望下次 sender 送过来的数据的序列号,所以当 sender 收到 3次重复的 ack(也就是 ack 序列号都一样),这个时候就会重新发送丢包或者延迟的 packet

快速重传:在发生 timeout 之前重传数据。

TCP Nagle Algorithm & Delay Ack

以上两种策略都是针对TCP 频繁传送小包的情况,

  1. Nagle Algorithm: 发送一个小包后,如果这个小包还没有被 ack ,则后面等待发送的少量数据,会进入 buffer 缓冲区,
    这部分数据在等待时间到了后才会被统一发送出去。
  2. Delay Ack: receiver 收到的数据如果不是按顺序送进来的,则会先不发 ack ,等一定顺序的数据都到了后,统一发 ack, 尽量减少 ack 的次数。
    根据他们的处理机制可以知道,这两种策略都是牺牲时效性来提升性能。遇到时效性高的应用场景,可以自行关闭。

参考资料:

TCP Overview
TCP Flow Control and Congestion Control
通俗大白话来理解TCP协议的三次握手和四次分手

你可能感兴趣的:(TCP 协议概览)