计算机网络--面向连接的运输:TCP

概述

TCP协议运行于端系统中,中间路由器对TCP连接完全视而不见,他们看到的是数据报,而不是连接。TCP是点对点通信,即是发生在单个发送方与单个接收方之间的通信。
计算机网络--面向连接的运输:TCP
在实际编程中,接收缓存与发送缓存可通过setsockopt设置SO_SNDBUF、SO_RCVBUF。 getsockopt 可用于查看当前系统的发送与接收缓存的大小。
系统的默认socket 发送缓冲区(SO_SNDBUF)的大小为8K,我们可以调用setsockopt()将其更改,理论上最大为64K
应用程序将要发送的数据放到发送缓存中,前提是发送缓存不满,TCP会从缓存中取出数据并放入报文段,大小取决于 MSS (maximum segment size),MSS的大小 是 MTU 减去 TCP/IP首部长度(通常为40字节)。
MTU (maximum transmission unit)表示链路层的最大传输帧长度。以太网与PPP连路具有1500字节。因此MSS一般为1460字节。

TCP报文段结构

计算机网络--面向连接的运输:TCP
TCP 首部一般为20byte,比UDP的多12byte。
1. 序号和确认号
序号是建立在字节流之上的,即每个字节有自己的序号,举例来说:
假设数据流是由一个包含500000个字节的文件组成,MSS大小为1000,首字节编号为0,TCP将为该字节流创建500000/1000=500个报文段,第一个报文段sequence number 是0,第二个报文段 sequence number 是 1000,第三个是2000…。。
计算机网络--面向连接的运输:TCP
一条TCP连接双方均可随机的端选择初始序号。
ACK 中携带的是clent 或 server 端希望接收的下一个报文的序号,因为TCP连接是全双工的,所以client 和 server都包含ACK。
2. 接收窗口
接收窗口用于流量控制,以消除发送方使接收方缓存溢出的可能性。
接收窗口用于给发送方一个指示,即该接收方还有多少可用的缓存空间。
计算机网络--面向连接的运输:TCP
上图中的 rwnd既是接收窗口。
反观UDP,并不提供流量控制,上层将数据添加到相应的套接字,如果缓存已满,则产生溢出,并丢弃报文段。
3. SYN, FIN, RST
TCP 建立连接过程计算机网络--面向连接的运输:TCP
step 1:client send package without app data, SYN bit =1, random Seq number — Clinet_seq…
step 2: server allocate receive buffer, send package back to sender without app data, SYN bit =1, random Seq number—server_seq, ACK=client_seq + 1.
step 3: client allocate send buffer, send package to server, SYN bit = 0, Seq=client_seq+1, ack=server_seq+1. 可以携带 app data 到报文段负载中。
TCP 三次握手的 过程 是让双方都知道 对方可达,因为TCP 是全双工的。

TCP close TCP连接过程
计算机网络--面向连接的运输:TCP
RST— 如果server收到一个目的端口为80 的连接请求,但是 server 端在80端口上不接受连接,则 server端向源发送一个重置报文,该报文中将RST置 1.

报文传输失败与重传
报文的传输很可能传输超时,这个超时时间如何设置呢,大的 原则是超时间隔必须大于该连接的往返时间(RTT),但是RTT是随着网络环境的变化实时变化的,我们可以使用一种估计往返时间的算法(SampleRTT)。
快速重传:如果TCP发送端收到三个对相同数据的3个冗余ACK,则执行立即快速重传。
计算机网络--面向连接的运输:TCP
计算机网络--面向连接的运输:TCP

拥塞控制

拥塞是怎么产生的呢? 太多的源以太高的速度发送太多的数据往网络上。
拥塞时的外在表现:一,路由器缓存溢出导致包丢失;二,高时延。
网络产生拥塞会产生如下代价:

  1. 当分组的到达速率接近链路容量时,分组经历巨大的排队时延。
  2. 发送方必须执行重传以补偿因为缓存溢出而丢弃的分组。
  3. 发送方有可能重传还在路由器中缓存的分组,造成路由器转发不必要的分组。
  4. 当一个分组沿一条链路被丢弃时,每个上游链路器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了。如下图所示:
    计算机网络--面向连接的运输:TCP

TCP拥塞控制

1. 发送方如何检测网络拥塞?
当出现拥塞时,沿着这条链路上的一个或多个路由器缓存溢出,导致数据报丢失,进而导致***发送方发送超时,或者收到三个冗余的ACK***。

2. 发送方如何控制发送速率?
发送方的TCP拥塞控制机制跟踪一个变量,拥塞窗口(congestion window),表示为cwnd。
发送方未被确认的数据量应该小于 cwnd 与 rwnd的最小值。
LastByteSent - LastByteAcked <= min {cwnd, rwnd}.
粗略的讲,发送方的发送速率为 cwnd/RTT 字节/秒。
因此,发送方可以通过调整cwnd,来调整发送数据端速率。
3. TCP发送方如何确定它们的发送速率,既使得网络不会拥塞,与此同时又能充分利用所有可用的带宽呢?
guide 1: 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率。
guide 2: 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认到达时能够增加发送方的速率
guide 3: 带宽检测,TCP调节其传输速率的策略是增加其速率以响应到达的ACK, 除非出现丢包事件,此时才减小传输速率
4. TCP 拥塞控制
每个RTT内,cwnd线性增加1 MSS,然后出现三个冗余的ACK事件时,cwnd减半。因此,TCP拥塞控制常常被称为 加性增,乘性减(Additive-Increase, Multiplicative-Decrease,AIMD) 拥塞控制方式。看起来像下图所示锯齿状。
计算机网络--面向连接的运输:TCP

TCP共享链路公平性

如果有两条TCP链接共享一个带宽为R的链路,
计算机网络--面向连接的运输:TCP
长远看,每个TCP链接的平均速率为R/2.两条链路实现的带宽将沿着平等带宽共享曲线在波动,无论这两条连接位于二维空间的何处,他们最终都会收敛到该状态。
计算机网络--面向连接的运输:TCP

UDP 公平性

UDP并没有内置拥塞控制算法,当多媒体应用运行在udp之上时,这些应用能够以恒定的速率将其音频和视频数据注入网络之中并且偶尔会出现丢失分组。而不愿在拥塞时将其发送速率降至“公平”级别并且不丢失任何分组。因此udp源有可能压制TCP流量

TCP 是如何保证可靠性的?

不可靠传输的四种表现方式为:package 本身差错, 包丢失,报文失序,报文重复。
TCP是如何应当的呢?
差错–>端到端校验和
失序–》seq header
重复–》seq header
包丢失 --》超时重传 + 确认