TCP一文

TCP

为了提供可靠的数据传输,TCP依赖很多底层原理,包括:错误检测,重传,累计确认,计时器,和头部域序号和确认号

1512814-02ea13c7a7d8b6dd.png
1559025245343.png

1. TCP连接

TCP是一个面向连接的协议,因为在一个应用进程开始发送数据给另一个之前,两个进程必须首先相互 “握手” ,也就是,他们必须相互发送一些初步的段(segment)来确认用来建立可靠数据传输的参数,作为建立TCP连接的一部分,连接的双方将会初始化很多于TCP连接关联的TCP状态变量。

TCP连接能够提供全双工服务(full-duplex service)。如果一台主机上的进程A与另一台主机上的进程B有一条TCP连接,那么应用层的数据可以从进程A流动到进程B,与此同时应用层的数据也可以从进程B流动到进程A。

一条TCP连接也是点对点(point-to-point)的,也就是一个发送者和一个接收者。而被称为“多播”的则是数据传输从一个发送者到多个接收者在一个发送操作中完成。这对于TCP是不可能的,对于TCP来说两个正好,三个太多。

1512814-535e636de6983d61.png
1559029698967.png

让我们来考虑从客户端进程向服务端进程发送数据。客户端进程通过套接字传递数据流,如图3.28所示,TCP将此数据定向到连接的发送缓冲区,该缓冲区是在三次握手期间初始化的缓冲区之一。 TCP将不时地从发送缓冲区中获取数据块并将数据传递到网络层。可以获取的并且放置在一个段中的最大数据量受 MSS(maximum segment size)的限制。 通常通过首先确定本地发送主机可以发送的最大链路层帧的长度(maximum transmission unit, MTU)来设置 MSS,然后设置MSS以确保TCP报文段(当封装在IP数据报中时)加上TCP / IP报头长度(通常为40个字节)能够装进单个链路层帧。 以太网和PPP链路层协议都具有1,500字节的MSS。 还有一种方法来发现路径MTU--可以在源到目的地的所有链路上发送的最大链路层帧[RFC 1191] - 并根据路径MTU值设置MSS。 请注意,MSS是段中应用层数据的最大数量,而不是包含标头的TCP报文段的最大大小。 (这个术语令人困惑,但我们必须忍受它,因为它根深蒂固。

TCP将客户端的每个数据块与TCP报文段头部配对,从而组从一个TCP报文段。TCP连接的双方都有自己发送缓冲区和接收缓冲区。

我们从这个讨论中看到,TCP连接由缓冲区,变量和到一个主机中的进程的套接字连接,以及另一组缓冲区,变量和到另一个主机中的进程的套接字连接组成。

2. TCP报文段的结构

TCP报文段由多个头部字段和一个数据字段组成,数据字段包含了一块应用层数据,上文提到过, MSS 限制了报文段的数据字段的最大大小。

1512814-684ce3ce951515b2.png
1559031830150.png

3. 往返时间(RTT)估计和超时

在实现 超时/重传 机制时候有很多微妙的问题出现。可能最明显的问题是超时间隔的长度(the length of timeout intervals)。很明确的是,超时时常莺歌大于连接的往返时间(RTT),就是从一个报文段从被发送直到被确认的时间。

估计RTT

大多数TCP实现不是对每个传输的报文段都测量SampleRTT,而是一次只进行一次SampleRTT测量。 也就是说,在任何时间点,仅针对所发送但当前未确认的报文段段之一估计SampleRTT,从而在每个RTT大约一次得到SampleRTT的新值。 此外,TCP从不为已重新传输的段计算SampleRTT; 它仅测量已传输一次的段的SampleRTT。

x 的推荐值是0.125(也就是1/8)[RFC 6298]

注意EstimatedRTT是SampleRTT的加权平均值

RTT的波动

x 的推荐值是0.25

设置和管理重传超时间隔

TimeoutInterval 的初始值推荐是1 [RFC 6298]

4. 可靠数据传输

  • 加倍超时间隔
  • 快速重传(三个重复的ACK)
  • GBN和SR

5. TCP流量控制

调节发送者的发送速度

  • 接收缓冲区
  • 接收窗口rwnd

6. TCP连接管理

7. TCP拥塞控制

  • 慢启动
  • 拥塞避免
  • 快速恢复
  • AIMD

猜你喜欢

转载自blog.csdn.net/weixin_34277853/article/details/90784949