总结计算机网络运输层知识,主要是TCP和UDP协议特点。
运输层协议概述
- 运输层向上面的应用层提供通信服务。
- 两台主机进行通信是主机中的应用进程相互通信。
- 网络层为主机之间的通信提供服务,而运输层在网络层基础上,为应用进程之间的通信提供服务。
- TCP协议提供可靠协议,通过差错检测等方式在逻辑上实现,而底层网络层通信时不可靠的。
- TCP是逻辑上的一条全双工的可靠通信,UDP协议是不可靠通道。
- 运输层两个主要协议用户数据报协议UDP和传输控制协议TCP。UDP传输数据前不需要建立连接,而TCP是提供面向连接的服务。
运输层协议 | 应用层协议 | 协议全称 | 默认端口 |
---|---|---|---|
TCP | HTTP | HyperText Transfer Protocol(超文本传输协议) | 80 |
TCP | FTP | File Transfer Protocol (文件传输协议) | 20用于传输数据 21用于传输控制信息 |
TCP | SMTP | Simple Mail Transfer Protocol (简单邮件传输协议) | 25 |
TCP | TELNET | Teletype over the Network (网络电传) | 23 |
TCP | SSH | Secure Shell | 22 |
UDP | DNS | Domain Name Service (域名服务) | 53 |
UDP | TFTP | Trivial File Transfer Protocol (简单文件传输协议) | 69 |
UDP | SNMP | Simple Network Management Protocol (简单网络管理协议) | 通过UDP端口161接收 只有Trap信息采用UDP端口162 |
UDP | NTP | Network Time Protocol (网络时间协议) | 123 |
用户数据报协议UDP
特点
- 无连接,发送数据前不需要建立连接。
- 使用尽最大努力交付,不保证可靠交付。
- 面向报文。UDP一次传送和交付一个完整的报文。
- 没有拥塞控制。网络出现拥塞不会是源主机的发送速率降低。
- 支持一对一、一对多、多对一、多对多等交互通信。
- 首部开销小,只有8个字节。
复用:将UDP用户数据报组装成不同的IP数据报,发送到互联网。
分用:根据UDP用户数据报首部中的目的端口号,将数据报分别传送到相应端口,以便应用进到端口读取数据。
分用时,找不到对应的目的端口号,丢弃报文,并给发送方发送ICMP“端口不可达”错误报告报文。
UDP首部格式
UDP数据报两个字段,数据字段和首部字段,首部字段只有8个字节,由4个字段组成,每个字段的长度都是2个字节。
- 源端口:源端口号。
- 目的端口:目的端口号。
- 长度:UDP数据报的长度,最小为8(首部)。
- 检验和:检测UDP用户数据报在传输过程中是否有错,有错就丢弃。

校验和生成:
- 填上伪首部。
- 全零填充校验和字段。
- 如果UDP数据报加上伪首部总长度不是2字节的倍数,则全0填充数据部分,补充为2字节的倍数。
- 伪首部+首部+数据部分采用二进制反码求和。
- 将和进行求反码填入校验和字段。
检验和检验:
- 填上伪首部。
- 伪首部+首部+数据部分采用二进制反码求和。
- 结果全为1则无差错,否则对其数据报/交给应用层附上差错警告。
传输控制协议TCP
特点
- TCP是面向连接的运输层协议,在使用TCP协议之前,必须要建立TCP连接,传输完毕后,释放连接。
- TCP是端到端通信(点对点)。
- TCP提供可靠交付的服务,无差错、不丢失、不重复,并且按序到达。
- TCP提供全双工通信,TCP连接的两端都设有发送缓存和接收缓存。
- TCP是面向字节流。把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP首部格式

-
源端口和目的端口:各占两个字节。
-
序号:4个字节,TCP是面向字节流的,序号记录的数据部分第一个字节在原数据的字节序号。
-
确认号:期望收到对方下一个报文段的第一个数据字节的序号。
$$
若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
$$ -
数据偏移:指出TCP的首部长度,单位是32位(4字节),数据偏移的最大值是60字节(TCP首部的最大长度),占4位。
-
紧急URG:URG=1,表示紧急指针字段有效,该报文段有紧急数据,具有高优先级,不必再原来排队顺序等待传送。
-
确认ACK:ACK=1时确认号字段才有效,TCP建立建立后所有报文段都必须把ACK置为1。
-
复位RST:TCP连接中出现严重差错,必须释放连接,重新建立运输连接。
-
同步SYN:连接建立用来同步序号,SYN=1而ACK=0,表明这是一个连接请求报文段。
-
终止FIN:释放连接。
-
窗口:窗口值作为接收方让发送方设置其发送窗口的依据。
-
校验和:加上伪首部进行计算校验和,检验范围包括首部和数据两部分,占两个字节。
停止等待协议
-
发送完一个分组就停止发送、等待对方的确认,收到确认后再发送下一个分组。
-
设置超时重传机制。当发送方在超过一定时间未收到接受方发来的确认,则再发送一次该分组。
发送方发送完一个分组后必须要保留已发送分组的副本,超时重传需要再次发送,只有收到相应的确认后才能清除分组副本。
超时重传设置时间比分组传输的平局往返时间更长些,超时重传的时间通过动态计算来更新:
$$
新的RTT_S=(1-\alpha)\times(旧的RTT_S)+\alpha\times(新的RTT样本)
$$计算会给出多个RTT样本,每一个都要带入公式计算,而不是样本取平均再带入计算。
如果报文段重传了,就不采用其往返时间样本,不参与计算。
确认和重传禁止,可以在不可靠的传输网络上实现可靠通信,该协议常称为自动重传请求ARQ。
信道利用率计算:
$$
U=\frac{T_D}{T_D+RTT+T_A}
$$
- TD:发送方发送分组消耗时间。
- RTT:数据在信道传输的时间。
- TA:接收方发送确认分组的时间。
连续ARQ协议:
发送方维持一个发送窗口,可一次性发送窗口内的所有分组(流水线),不用一个一个等待确认。接收方采用累计确认的方式,对按序到达的最后一个分组发送确认,通过确认,发送方来移动发送窗口。
TCP流量控制
流量控制就是让发送方的发送速率不要太快,让接收方来得及接收。
发送方的发送窗口不能超过接收方给出的接收窗口。
通过TCP首部中窗口值限制发送方的发送窗口大小,来实现流量控制。
TCP为每一个连接设有一个持续计时器,只要TCP连接的乙方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段,接受方收到探测报文段给出现在的窗口值。
TCP拥塞控制
拥塞控制时防止过多的数据注入到网络中,时网络中路由器或链路不至于过载,是一个全局性的过程。而流量控制往往是指点对点通行量的控制,是端到端的问题。
慢开始与拥塞避免

发送方维持一个拥塞窗口,让自己的发送窗口等于拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度,动态变换。
慢开始是发送窗口由小到大逐渐增大拥塞窗口数值,每次两倍增加。同时还要设置慢开始的门限,防止拥塞窗口增长过大引起网络拥塞。
当增大慢开始的门限值,使用拥塞避免算法,成线性缓慢增长。
当出现网络阻塞,门限值减半,同时拥塞窗口设置为1,执行慢开始算法。
快重传和快恢复

当出线网络阻塞,门限值减半,同时拥塞窗口设置为新的门限值,执行快恢复算法(拥塞串口值线性增长)。
快重传算法要求接收方不要等待在自己发送数据时才进行捎带确认,而是立即发送确认,即使收到了失序的报文段也要立即发送对已收到的报文段的重复确认。
对收到三个连续对分组的确认,则立即重传该分组。
网络阻塞:采用慢开始算法。
三个超时重传确认:采用快重传算法。
TCP连接管理
TCP连接

TCP连接建立采用三次握手机制。
- 第一次:客户端发送连接请求报文,无应用层数据。$SYM=1,seq=x(随机)$。
- 第二次:服务器为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。$SYN=1,ACK=1,seq=y(随机),ack=x+1$。
- 第三次:客户端为该TCP连接分配缓存和变量,并向服务器返回确认的确认,可以携带数据。$ACK=1,seq=x+1,ack=y+1$。
ack是确认号,seq是报文段的序号。
TCP释放

TCP的连接释放需要4次握手。
- 第一次:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。$FIN=1,seq=u$。
- 第二次:服务器返回一个确认报文段,客户到服务器这个方向的连接就释放了,处于半关闭状态。$ACK=1,seq=v,ack=u+1$。
- 第三次:服务器发送完数据,就发出连接释放报文段,主动关闭TCP连接。$FIN=1,ACK=1,seq=w,ack=u+1$。
- 第四次:客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。$ACK=1,seq=u+1,ack=w+1$