传输层位于OSI模型的第四层,实现端对端的数据传输,实现数据的分段、传输、组装及差错控制、流量/拥塞控制等功能。
一、TCP
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
(一)TCP报文首部
源端口(16bit) | 目的端口(16bit) | ||||||||
序列号seq(32bit) | |||||||||
确认号ack(32bit) | |||||||||
报头长度(4bit) | 保留(6bit) | U R G | A C K | P S H | R S T | S Y N | F I N | 窗口(16bit) | |
校验和(16bit) | 紧急指针(16bit) | ||||||||
选项(长度可变) | 填充 | ||||||||
数据部分 |
源/目端口:表示源端和目的端的应用进程,范围0-65535。
序列号:标识了TCP发送端到TCP接收端的数据流的第一个字节。新连接建立时,第一个报文段的SYN位启用,此时第一个序列号是随机的,不能为0或1。
确认号:确认号包含的值是该确认号的发送方期待接收的下一个序列号。该字段在ACK位被启用的情况下起效。
报头长度:单位为4B,值为0101-111,即20B-60B。
保留:通常为0。
URG(1bit):紧急位。如传输带外数据,需将此位置1。紧急指针字段也需将此位置1才有效。表示数据需尽快传送。
ACK(1bit):确认位。表示“确认号”字段有效,连接建立后一般都是启用状态。
PSH(1bit):推送位。接收方应尽快将该报文段交给上层协议,无需等待缓存满。
RST(1bit):复位位。重置连接。
SYN(1bit):同步位。发起连接,初始化一个连接的同步序列号。
FIN(1bit):终止位。释放连接,表示该报文段的发送方已结束向对方发送数据。
校验和:对TCP头部和数据部分进行校验和计算。
紧急指针:该字段在URG字段值位时起效,“指针”是一个必须要加到报文段序列号字段上的一个正偏移,以产生紧急数据的最后一个字节的序列号。
(二)TCP建立连接。
TCP通过三次握手来建立连接。流程如下:
1. 源主机向目的主机发送一个SYN位置1的TCP报文,seq序列号是随机的,即SYN=1、seq=x,报文发出后,源主机进入SYN-SENT状态。
2. 目的主机收到源主机SYN=1的报文,发回确认报文。该报文中ACK位置1,SYN位置1,确认号ack=x+1,序列号seq=y(随机产生)。该报文发出后,目的主机进入SYN-RCVD状态。
3. 源主机收到目的主机回复后,进入ESTABLISHED状态,向目的主机返回一个确认报文。该报文中ACK位置1,确认号ack=y+1,序列号seq=x+1。目的主机收到源主机报文后,进入ESTABLISHED状态。
(三)TCP释放连接
TCP通过四次挥手来释放连接。流程如下:
1. 源主机向目的主机发送一个报文,用以释放连接。其中,FIN=1,自身序列号seq=x,源主机进入FIN-WAIT状态。
2. 目的主机收到后,向源主机回复。该报文中ACK位置1,确认号ack=x+1,自身序列号seq=y,目的主机进入CLOSE-WAIT状态。此时,源主机停止发送数据,但目的主机仍然可以发送数据,TCP连接为半关闭状态(HALF-CLOSE)。
3. 目的主机无数据发送后,向源主机发送释放报文(FIN=1,ACK=1,确认号ack=x+1,自身序列号seq=z),目的主机进入LAST-ACK状态。
4. 源主机收到释放报文后,向目的主机发出确认报文。(ACK=1,确认号ack=z+1,序列号seq=x+1),进入CLOSE状态。
(四)TCP拥塞控制。
1. 拥塞控制与流量控制的区别
①拥塞控制:在两端及所有中间网络节点中进行控制。
②流量控制:仅在发送端和接收端进行,是局部控制。
2. 慢启动与拥塞避免
ssthresh:慢启动门限值。
cwnd:拥塞窗口。
慢启动算法:每轮传输后cwnd值翻倍。
拥塞避免算法:每轮传输后cwnd值加1。
①cwnd<ssthresh时,启动慢启动算法。
②cwnd=ssthresh时,即可使用慢启动,也可使用拥塞避免算法。
③cwnd>ssthresh时,启动拥塞避免算法。
当出现网络拥塞,发生超时,则执行乘法减小(将此时的cwnd值减半,并将该值作为ssthresh阈值),随后从cwnd的初始值再次开始执行慢启动算法。
3. 快重传和快恢复
快重传:发送方只要收到三个连续重复确认,就立即重传对方未收到的报文段,无需等待重传计时器到期。
快恢复:当发送方只要收到三个连续重复确认时,执行乘法减小(将此时的cwnd值减半,并将该值作为ssthresh阈值),随后从此时减半的cwnd值开始执行拥塞避免算法。
4. 随机早期检测RED
路由器采用随机早期检测(RED)算法,来避免“全局同步”现象。
该算法中,路由器队列维持长度最小门限值THmin和最大门限值THmax,对于每个到达的数据报都先计算平均队列长度Lav。
①若Lav<THmin。则将新到达的数据报放入队列排队。
②若Lav>THmax。则将新到达的数据报丢弃。
③若THmin<Lav<THmax。则按照概率p,将到达的数据报丢弃。
(五)重传时间
1. 往返时间
RTT=链路层传播时间+端点协议栈处理时间+中间设备处理时间
2. 加权平均往返时间
RTTS初始值=计算出的第一个RTT;
RTTS=(1-α))×(旧的RTTS)+α×新的RTT样本;
α建议取1/8。
3. 超时重传时间
RTO=RTTS+4×RTTD(RTT的加权平均值);
RTTD初始值为(1/2)×RTT样本值;
新的RTTD=(1-β)×(旧的RTTD)+β×|RTTS-新的RTT样本|;
β建议取1/4。
(六)TCP计时器
1. 重传计时器。
2. 坚持计时器。防止“零窗口死锁”发生。数据传输中可能会出现窗口值报文丢失,当报文接收端告知发送端其能够继续接收数据的报文丢失,数据发送端依旧认为窗口值为零的情况。计时器到期后,数据接收端会主动向发送端发起探测。
3. 保活计时器。用来防止两个主机间的TCP连接长时间空闲,一般是为服务器应用程序提供,但TCP连接的两端都可以开启此功能。缺省为2小时,向对方发送若干次探测报文。Linux和Mac OS X系统中探测报文发送9次,间隔为75秒;FreeBSD系统中探测报文发送8次,间隔为75秒;Windwos系统中探测报文发送10次,间隔为1秒。若这些探测报文均无响应,则终止连接。
4. 时间等待计时器。连接终止时,不会立即断开连接,而是等待一段时间,确保能收到对端的响应。
二、UDP
UDP是一种不可靠的、无连接的数据报服务。
(一)UDP报文头部
源端口号(2B) | 目的端口号(2B) |
长度(2B) | 校验和(2B) |
数据 |
源/目端口:表示源端和目的端的应用进程,范围0-65535。源端口号在不需要对方回信时可填写全0。
长度:表明UDP头部字段和数据字段的总长度字节数。
校验和:覆盖UDP头部、数据、伪首部。在IPv4中为可选字段,在IPv6中为必选字段(IPv6头部无校验字段)。
校验和计算方法:按照16位为1组展开(含伪首部)。若最高位没有进位,则相加取反;若最高位进位,则将最后位加1后再取反
(二)伪首部
源IP地址(4B) | 目的IP地址(4B) | 0(1B) | 17(1B) | UDP长度(2B) |
伪首部在实际传输中不会进行传输,用于源/目IP及UDP数据报校验。伪首部本身违反分层规则,当数据传递到(或来自于)UDP时,IP层的信息已经存在了。
三、端口
(一)系统端口(低位端口、熟知端口):0-1023。
(二)登记端口(注册端口):1024-49151。
(三)客户端使用端口(动态/私有端口):49151-65535。
备注:后两个加一起也被称为“高位端口”。
(四)基于TCP的常用端口号
20 FTP-DATA
21 FTP
22 SSH
23 TELNET
25 SMTP(邮件发送)
80 HTTP
110 POP3(邮件接受)
143 IMAP
179 BGP
443 HTTPS
3389 RDP(远程桌面服务)
(五)基于UDP的常用端口号
53 DNS(当数据传输量较大时,也会使用TCP连接,端口也为53)
67 DHCP-SERVER
68 DHCP-CILENT
69 TFTP
161 SNMP
162 SNMP-TRAP
500 IKE
520 RIP
546 DHCPv6-Cilent
547 DHCPv6-Server