该协议至少需要增加一个多路分解功能,使得主机上多个进程能够共享网络。
端口(port):一种抽象定位器,使进程能够间接相互识别。基本思想是源程序向端口发生报文,而目的程序从端口接收报文。
UDP首部格式
知名端口(well-known port):服务器在知名端口接收报文
端口映射(port mapper):知名端口只有一个,端口映射服务接收报文的端口。客户向该端口发生报文,询问某服务的端口,服务程序返回相应的端口。
TCP 能保证可靠的、有序的字节流传输。
全双工协议,即每个 TCP 连接支持一对字节流,每个方向一个字节流。
TCP 包含流量控制机制,支持多路分解,实现了高度协调的拥塞控制机制
流量控制与拥塞控制
TCP是面向字节的协议,即发送方向TCP连接写入一个字节,接收方从这个TCP连接中读出字节。但TCP并不转发单个字节,而是积累到足够数量后再发送。
TCP多路分解键由 <源端口,源IP地址,目的端口,目的IP地址> 四元组给出
对于同一个多路分解,在连接断开后又建立,称为相同连接的不同实例(incarnation)
确认号(Acknowledgement)、序号(SequenceNum)和通知窗口(AdvertisedWindow)字段都在TCP的滑动窗口算法中使用。
校验和(CheckSum)字段与UDP用法一致
TCP连接和断开的状态图,每一个矩形表示一个状态,每个弧线用事件/操作(event/action)的形式标记。
对于连接的断开(ESTABLISHED
TCP 滑动窗口算法的变体,服务于
对于发送方,发送程序向 LastByteWritten 后写入要传输的数据并更新该指针。LastByteSent 表示最后发送的字节,而 LastByteAcked 表示收到确认的最后一个字节,之前的字节均已确认。
对于接收方,接收程序从区间
收发双方均有缓冲区大小的限制,分别表示为 MaxSendBuffer 和 MaxRcvBuffer
窗口的大小决定了可以被发出而不需要等待接收方确认的数据的大小,这个大小取决于接收方能缓存的数据量。接收方通过通知发送方该窗口大小,就可以控制发送方发送速率。TCP 的接收方需要满足
可以避免缓冲区溢出,所以向发送方通知窗口的大小应为
发送方必须确保
即发送方计算一个有效窗口,限制其能发送数据的大小
同时发送方还需要确保其发送的内容不超出其缓冲区
若打算发送
则 TCP 会阻塞发送进程。
TCP 总是发生一个报文段对接收到的报文段进行应答,应答包含确认号(Acknowledgement)和通知窗口(AdvertisedWindow)。当通知窗口变为
零窗口探测(zero window probe):当通知窗口变为
push
操作,要求发送一个报文段。自适应重传:如果 TCP 发送方在一定时限内未收到 ACK ,那么就会重传这个报文段,自适应重传是选择这个时限的算法。
每次发送一个报文段,记录发送时刻,并记录对应 ACK 收到的时刻,计算时间差作为 SampleRTT,然后用以前的估计值 EstimatedRTT 和这个值来古今新的估计值,即
参数
重发可能会导致 SampleRTT 过大或过小的情况
解决办法:TCP 重传一个报文段时,停止计算 SampleRTT。同时每次 TCP 重传时,设置超时值为上一次的两倍。
动机:如果样本变化小,说明 EstimatedRTT 较为可信,但如果样本变化大,说超时值远不止 EstimatedRTT 的两倍
计算方法
其中
超时值计算为
通常,