运输层
概述
为运行在不同主机上的应用进程提供直接的通信服务,
运输层协议又称端到端协议
端口号、复用、分用
端口号
- 为使用TCP/IP体系的应用进程进行标识
- 使用16bit表示,取值为0~65535
- 熟知端口号:0~1023,IANA分配给TCP/IP体系中最重要的应用协议:如FTP(21/20),HTTP(80),DNS(53)。
- 登记端口号:1024~49151:须在IANA按规定等级,防止重复。
- 短暂端口号:49152~65535:留给客户进程暂时使用,通信结束后,可供其他客户进程使用。
- 只具有本地意义
复用
分用
TCP/IP体系应用层使用的运输层熟知端口号
UDP协议 | TCP协议 |
---|---|
RIP:520 | SMTP:25 |
DNS:53 | FTP:21/20 |
TFTP:69 | BGP:179 |
SNMP:161 | HTTP:80 |
DHCP:67/68 | HTTPS:443 |
TCP与UDP
UDP
- 无连接服务,直接进行数据传输
- 支持单播,多播,广播
- 面向应用报文:将上层交付的应用层报文无合并无切割,保留边界,封装首部并交付
- 向上层提供无连接、不可靠服务,适用于实时通信应用
- 首部仅8个字节,由源端口、目的端口、长度、检验和构成
接收端收到有差错的报文,直接丢弃
TCP
面向连接服务,传输前先三报文握手,传输后四报文挥手结束连接,仅单播通信
面向字节流:
-
将应用层交付的数据块视为无结构的字节流并编号存储在高速缓存
-
依据发送策略,从缓存提取一定数量的字节封装TCP首部,发送
-
接收方接收TCP报文段并缓存,同时将缓存中的一些字节交给应用层
-
这是实现可靠传输、流量控制、拥塞控制的基础
-
向上提供面向连接、可靠传输服务,适用于要求可靠传输的应用,例如文件传输
-
首部最小20字节最长60字节
TCP流量控制
利用滑动窗口机制
- TCP接收方通过利用自身的接收窗口限制发送方发送窗口的大小
- TCP发送方收到接收方的零窗口通知后,立即启动持续计时器,超时后,向接收方发送零窗口探测报文防止死锁
- TCP发送放的发送窗口 = min[接收方接收窗口,自身拥塞窗口
cwnd
],初始值为拥塞窗口值。 - 在发送方接收对段的确认报文时,滑动窗口并根据新接收窗口值回缩相应长度。
滑动窗口与MSS:滑动窗口决定一口气可发多少个字节,而MSS则声明这些字节分多少个包发送
TCP拥塞控制
出现拥塞而不进行控制,将使整个网络的吞吐量随输入负荷的增大而下降
下述四种拥塞控制算法基于3个假定:
- 数据单方向传送,另一方向仅传送确认
- 接收方拥有足够大的缓存空间,也就是发送方发送窗口的大小由网络拥塞程度决定
- 以最大报文段MSS的个数为单位,而非字节
慢开始与拥塞避免
发送方维护拥塞窗口cwnd
和慢开始门限ssthresh
变量,其值动态变化,变化规则为:
- 网络没有出现拥塞,每一轮接收方确认n个TCP报文段,
cwnd+=n
,初始值为1- 实际上
cwnd
是以2为底的指数型增长的 - 此时为慢开始过程
- 实际上
cwnd>=ssthresh
时,执行拥塞避免算法,也就是每一轮传输,cwnd+=1
,呈线性增长- 当网络出现拥塞(发送方超时重传)时,
ssthresh=cwnd/2
,cwnd
置为1,重新开始慢开始算法- 这会消费一个RTT
有时,个别报文段在网络中因非拥塞原因丢失,这将导致发送方触发超时重传,且误认为网络拥塞,影响传输效率
快重传
不等待超时重传计时器,尽快进行重传:
- 接收方对接受的数据立即进行确认,如果
第n个报文段丢失
,则对后续报文段(也就是未按序到达的报文段)重复发送确认第n-1段
的报文 - 发送方连续收到3个重复确认第n-1的报文,立即重传第n个报文
- 接收方收到后,此时报文已按序抵达,发送针对最后一个报文的确认报文
快恢复
发送方一旦收到3个重复确认,不启动慢开始,执行快恢复算法:
- 发送方将
ssthresh
和cwnd
值调整为当前拥塞窗口的一半,执行拥塞避免算法
超时重传时间的选择
RTO应略大于往返时间RTT,而RTT则受多方面因素影响,较难得出
-
需要根据每次测量得到的RTT样本,计算加权平均往返时间RTTs。
-
计算RTT偏差的加权平均RTTD
(实际上连RTT的测量都是个非常复杂的问题)
TCP可靠传输
基于以字节为单位的滑动窗口来实现可靠传输
对于未按序抵达的数据的处理:
- 直接丢弃,这将造成网络资源的浪费
- 通常存放到接收窗口中,待字节流中缺少的字节收到后,按序交付上层的应用进程
TCP要求接收方必须由累计确认和稍待确认机制,可以减小传输开销
TCP为全双工通信,每一方都在发送和接收报文段,拥有自己的发送窗口和接收窗口
TCP建立连接
三报文握手
TCP服务器首先建立传输控制块,内含TCP连接表,发送、接收缓存的指针,指向重传队列的指针,当前的发送和接收序号,以及MSS(与TCP首部与IP首部长度相加既是自身最大传输单元MTU)随后进入监听状态
TCP客户端同样建立传输控制块,内容与TCP服务器一致
-
TCP客户端发送TCP连接建立请求,报文首部SYN=1,初始序号seq=x,进入SYN-SENT态
-
TCP服务器正确接收后发送确认报文,报文首部SYN=1,确认位ACK=1,初始序号seq=y,确认号字段ack=x+1,表明这是对TCP客户进程所选的初始序号的确认,进入SYN-RCVD态
-
TCP客户端发送针对TCP连接请求的确认的确认,确认位ACK=1,seq=x+1,ack=y+1,进入连接建立态
- 只有这条报文可以携带数据,如果携带,则下一条报文序号+1
- 如果不携带数据,下一条报文序号仍是x+1
-
TCP服务器接收到确认报文随即进入连接建立态。
每个数据段Seq号的确定:上一个数据段的Seq号+上一个数据段的长度;接收方与发送方维护各自的Seq号
确认号Ack:对方发送的Seq号+数据段长度,
三报文握手的最后一个报文正是用来防止已失效的连接请求报文段突然又传送到了TCP服务器,导致错误
TCP连接释放
四报文挥手
- TCP客户端发送连接释放报文,首部FIN=1,ACK=1,seq=u,ack=v
- v的值为收到的所有数据最大序号+1
- 随即进入FIN-WAIT终止等待状态
- 服务器收到后,回传确认连接释放报文,首部ACK=1,seq=v,ack=u+1,进入CLOSE-WAIT关闭等待状态
- 服务器此时仍可向客户端发送数据
- ack=u+1代表对之前TCP客户端发送的连接释放报文的确认
- 服务器结束所有数据传输工作,发送最终释放连接报文,首部FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-ACK最后确认态
- ack=u+1代表对之前TCP客户端发送的连接释放报文的重复确认
- 客户端发送确认最终释放连接报文,首部ACK=1,seq=u+1,ack=w+1
- 此时开始进入TIME-WAIT时间等待态,经过2MSL(最长报文寿命)后进入关闭状态
- 服务端接收到报文后,立即进入关闭态
保活计时器
用于应对已经处于TCP连接的客户端,服务端中,客户端发生故障的情况
- 通常设为2h
- 服务端每收到一次客户端发送的数据,就重置计时器
如果计时器超时,则服务器向客户端发送探测报文段,每75秒一次,连续10次无应答,服务器将关闭TCP连接。
TCP报文首部格式
序号:32bit,序号增加到最后一个后,下一个序号回到0
- 指出本TCP报文段数据载荷的第一个字节的序号
确认号:32bit,确认号增加到最后一个后,下一个确认号回到0
- 确认号=n,代表n-1为止的数据全部正确接收,期望接收序号为n的数据
确认标志位ACK:取值为1时,确认号字段有效,为0无效
- 连接建立后所有传送的TCP报文段必须把ACK置为1
数据偏移:指出数据载荷部分的起始位距离TCP报文的起始位有多少,占4bit,以字节为单位
- 首部固定长度为20B,故该字段最小值为0101,最大长度60B,对应字段值1111
窗口:发送本报文段的一方的接收窗口
- 接收方发送后,依此,发送方可以确定自身的发送窗口大小
- 流量控制的关键
校验和:16bit,检查报文首部与数据载荷部分
- 计算前,在报文段的前面添加12字节的伪首部
复位标志位RST:复位TCP连接。
- RST=1,表明连接出现异常,必须先释放,再连接
- RST=1,也可以用来拒绝非法报文段或拒绝打开一个TCP连接