传输层协议 Transport-layer protocol
- 提供运行在不同主机上的进程之间逻辑上的连接。(网络层提供主机间的逻辑连接)。
- 在终端系统上实现,而不在路由器上实现(网络上的路由器工作在网络层)(transport-layer protocols are implemented in the end systems but not in network routers.)
- 传输层复用和解复用(transport-layer multiplexing and demultiplexing)(extending host-to-host delivery to process-to-process delivery)
- 通过**端口号(port number)**实现
- 端口号 16位 (0-65535)
- 知名端口号(well-known port numbers)
- HTTP 80
- FTP 21 …
- UDP由2元组来区分一个连接 (目的IP,目的端口号) – 不区分来源
- TCP由4元组来区分一个连接(源的IP,源的端口号,目的的IP地址,目的的端口号) – 来源不同的段将分到不同的socket上
- 应用层使用UDP/TCP:
UDP(User Datagram Protocol)
-
不可靠的、无连接的(unreliable, connectionless)
-
没有建立连接的过程
-
没有连接状态(Connection state)
-
报头更小(8bytes)
-
UDP数据报结构 :
-
校验和(Checksum): 数据报中所有16bits的字的1的补码和(全部异或),再按位区分反。
-
接收方收到数据报后,计算数据报中所有16bits的字的1的补码和,若值为0xffff,则确认无误。
TCP(Transmission Control Protocol)
- 可靠的、面向连接的(reliable, connection-oriented)
- 提供拥塞控制(congestion control)
- 提供全双工服务(full-duplex service)
- 最大段长度(maximum segment size MSS):段可携带的大的数据长度
TCP段结构:
- header length field - 4bytes: 指示TCP头部的长度(以4字节为单位)(因为option field可变长所以需指示头部的长度)
- flag field - 6bits:
- CWR:用于拥塞控制
- ECE:用于拥塞控制
- URG:urgent
- ACK:acknowledgement field是否有效
- PSH:指示接收者应该立即把该段传递到上层
- RST:reset 端口号不匹配
- SYN:用于建立连接
- FIN:用于关闭连接
- 序号:该段中第一个字节的序号(在字节流中的序号)
- 积累确认(cumulative acknowledgement):TCP只确认流中到第一个丢失字节为止的字节。接收者回复ACK y,说明y以及y之前的字节已经被接收。
- TCP连接建立时,两方可随机地选择初始端口号,以减少先前网络中残余的段被错误接收的可能性
估计往返时间
往返时间(Round-Trip Time RRT) :从段发出到该段被确认之间的时间
- TCP对RRT的估计-以确定多长时间为超时
- 一种实现:
- 在某个时刻测量一次RRT,作为一个样本SampleRTT
- TCP维护一个平均值EstimatedRTT作为对RRT的估计:每测得一个新的SampleRTT,更新这个平均值 EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT.(指数加权移动平均值(exponential weighted moving average(EWMA))) (通常取α为0.25)
- 同时也维护一个对RTT变化的估计DevRTT,与对EstimatedRTT的计算方法相同: DevRTT = (1 - β) * DevRTT + β|SampleRTT - EstimatedRTT|* (通常取β为0.25)
- 用于确定超时的时间间隔:TimeoutInterval = EstimatedRTT + 4 * DevRTT (初始建议为1秒)
- 当超时发送时,TimeoutInterval = 2 * TimeoutInterval。当段重新被确认后更新EstimatedRTT,再从新计算TimeoutInterval。
实现可靠连接
- 更加详细
- TCP使用积累确认(cumulative acknowledgement):接收者缓存收的段(之前的Go-Back-N中是仅接收下一个期待的段),但只确认流中到第一个丢失字节为止的字节。若接收者回复ACK y,说明y以及y之前的字节已经被接收, 将SendBase推进到y。
- (一种实现)TCP只维护一个计时器,只检测最早的未确认的一个段是否超时。超时后,仅重发这个最早的段(而不是像Go-Back-N一样重发窗口内的所有段)。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVU54JDc-1643207580649)(TCPSender.png)]
- 快速重传(Fast Retransmit):发送者可以通过**冗余ACK(duplicated ACK)**来提前认为一个段丢失,不必等到超时发送后再重发。若发送者接收到三个相同的冗余ACK,就认为该段已经丢失,并重发
-
产生TCP ACK的建议:
-
TCP的错误恢复机制是GBN和SR的混合
-
流量控制
- TCP提供**流量控制服务(flow-control service)**以防止使接收者的缓冲区溢出
- TCP通过维护**接收窗口(receive window)**来实现流量控制。在报文段中携带接收窗口通知对方自己还的缓存还有少空闲空间。
- 接收窗口 : rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
- (LastByteRcv 收到的最后一个字节, LastByteRead 已经读取的最后一个字节)
- TCP要求发送者继续发送带1byte数据, 即使接收者的接收窗口为0
TCP连接管理
- 建立连接 – 三次握手(three-way handshake):
- 客户端向服务器发送SYN段(SYN标志位设为1)(客户端随机选择初始的序列号client_isn)
- 服务器接收到SYN段后,分配缓冲区、初始化变量…,发送SYNACK段(SYN标志位设置为1,ACK域为client_isn+1)(服务器也随机选择它的初始的序列号server_isn)
- 客户端接收到SYNACK后,初始缓冲区、初始化变量…,向服务器发送段(SYN=0,ACK=server+1,可能负载数据)
- 关闭连接 – 客户端和服务器端都可以提出关闭链接
- 客户端发出FIN标识位为1的段给服务器端
- 服务器收到后返回ACK
- 服务器稍后也发送FIN为1的段给客户端
- 客户端收到后返回ACK(返回ACK后会等待一段时间(一般为30s)以防ACK丢失)
- 此时,两台主机上的资源全部被释放
当客户端请求连接的端口不被监听时,服务器返回标志位RST为1的段
拥塞控制
- TCP使用端对端的拥塞控制(网络层的IP协议不提供显式的反馈)
- TCP通过限制发送端的发送速率来来控制拥塞
- 发送端维护一变量 拥塞窗口 congestion window(cwnd): 用于限制发送方能向网络中发送的流量的速率
- 一个发送方中未确认的数据量不会超过cwnd和rwnd(接收窗口,对方还能缓存多少):
- LastByteSent - LastByteAcked <= min{cwnd, rwnd)
- TCP使用ACK来触发拥塞窗口的增大–拥塞窗口的增加速率与ACK到达的速率正相关(TCP被称是自计时的)
- TCP控制发送速率的原则:
- 丢失报文段意味着拥塞,所以当报文丢失时降低发送速率
- 确认报文端意味着网络不拥塞,增加发送速率
- 带宽探测:即不断进行以上两条
- TCP拥塞控制算法(TCP congestion-control algorithm)
- 慢启动(slow start):
- 初始时,cwnd通常为1MSS(最大端长度)。每个ACK到达,将cwnd增加1MSS。发送速率将以2^n增长。
- 当超时发生时(报文段丢失),将cwnd设置为1,并将ssthresh(slow start threshold)设置为cwnd/2 (丢失发生前cwnd的一半)
- 当收到三个冗余的ACK时(报文段丢失,fast restransmit),进入快速恢复状态
- 当cwnd到达ssthresh时,进入拥塞避免状态
- 拥塞避免(congestion avoidance): 以更保守的方式增加cwnd
- 每RTT增加1MSS(可通过每一次ACK到达增加MSS/cwnd)
- 超时发生(丢失),将cwnd设置为1MSS,将ssthresh设置为cwnd/2,进入慢启动状态
- 收到三个冗余的ACK(丢失),将cwnd减半(再加3MSS),将ssthresh设置为cwnd/2,进入快速恢复状态
- 快速恢复(fast recovery): (TCP推荐的,并非必要)
- 对于引起进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。最终,对丢失报文段的一个ACK到达时,降低cwnd后进入拥塞避免状态。
- 如果超时发生,将cwnd设置为1MSS,ssthresh设置为cwnd/2,进入慢启动状态
- 慢启动(slow start):
- 假定丢包由3个冗余的ACK来指示,则cwnd在每个RTT内线性增加1MSS,三个冗余ACK到达时减半–>常称为加性增,乘性减(Additive-Increase, Multiplicative-Decrease, AIMD)
- 显示拥塞通知(Explicit Congestion Notification ECN):network-assited congestion control, 同时涉及TCP和IP
- IP数据报中有2bit用于ECN。一组值由于标识正在经历拥塞(有路由器设置)。另一组值用于通知路由器接收者和发送者ECN-capable。
- 接收方的TCP收到带ECN拥塞指示的IP数据包后,在返回ACK报文段时设置ECE(Explicit Congestion Notification Echo)位。发生方收到带ECE位的ACK时,(同收到冗余ACK时)减小拥塞窗口,再向接收发发生报文段时设置CWR(Congestion Window Reduced)位。