文章目录
1 传输层
从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。
传输层提供的是应用程序间的逻辑通信,也就是说它向高层(应用层)屏蔽了下面网络层的细节,使应用程序看起来好像是在传输层之间沿着水平方向传输数据,但事实上两者之间并没有这样一条实际的物理连接。
传输层还要对收到的报文进行差错检测。在网络层中,IP数据报首部中的检测和字段,只检测首部是否出现差错而不检测数据部分。
传输层只要包括面向连接的TCP和无连接的UDP。当传输层采用TCP协议时,尽快网络层是不可靠的,但是这种逻辑通信也相当于一个全双工的可靠信道。而当采用UDP协议时,这种逻辑信道就是一条不可靠信道。
1.1 主要协议
协议 | RFC | 数据单元 | 是否建立链接 | 接收到数据报后是否确认 |
---|---|---|---|---|
用户数据报协议UDP(User Datagram Protocol) | RFC768 | UDP用户数据报 | 不建立连接 | 不需要任何确认 |
传输控制协议TCP(Transmission Control Protocol) | RFC793 | TCP报文段 | 建立连接 | 需要确认 |
1.2 传输层端口
传输层通过端口(protocol port number)用以表示区分应用层具体是哪个应用进程在使用传输层传递数据。也就是说,只要应用进程把所传输的报文交到目的主机的某个目的端口,剩下的工作(即最后交付目的进程)就有TCP或UDP来完成。当然,某个应用程序指定的端口是可以修改的,我们所说的只是表示默认约定。
这里的端口指软件端口,而非硬件端口。例如:个人PC机一般只有一个网卡一个硬件端口,但是软件端口确有很多。
TCP/IP传输层用一个16位端口号(0~65535)来标识一个端口,但是注意,端口号只具有本地意义,不同计算机的相同端口号没有关联,0一般不用,所以允许有65535个不同的端口号。
传输层端口有可以分为以下两类。
1.2.1 服务器端使用的端口号
又分为两类:
- 熟知端口号(well-known port number)或系统端口号,数值为0~1023。详见
- 登记端口号,数值为1024~49151。这类端口号没有为熟知端口号的应用程序使用。但是必须在IANA按照规定的手续登记,以防止重复(当然属于内部程序时,可以不用登记)。
下面是一些常用的系统端口和指定的应用进程:
应用程序 | 默认端口 |
---|---|
FTP | 21 |
TELNET | 23 |
SMTP | 25 |
DNS | 53 |
TFTP | 69 |
HTTP | 80 |
SNMP | 161 |
SNMP(trap) | 162 |
HTTPS | 443 |
1.2.2 客户端使用的端口号
数值49152~65535。这类端口号仅在客户进程运行时才动态选择,因此又叫短暂端口号。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因此可以把数据发送给客户进程。通信结束后,刚才已使用的客户端口号就不复存在,这个端口号就可以提供给其他客户进程使用。
2 用户数据报协议UDP
UDP协议在IP协议上增加了复用、分用和差错检测功能。
2.1 UDP的特点
- 是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
- 是尽最大努力交付的。也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
- 是面向报文的。也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并。因此,传输层在收到对方的UDP包后,会去掉首部后,将数据原封不动的交给应用进程。
- 没有拥塞控制。因此UDP协议的发送速率不送网络的拥塞度影响。
- UDP支持一对一、一对多、多对一和多对多的交互通信。
- UDP的头部占用较小,只占用8个字节。
2.2 UDP的基本工作过程
-
UDP用户数据报传输过程中的封装与拆封
-
UDP报文传输队列
-
UDP的复用和分用
2.3 UDP协议格式
每个UDP报文分为UDP报头和UDP数据区两部分。报头由4个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。
真实抓包结果:
2.3.1 源端口
这个字段占据UDP报文头的前16位,通常包含发送数据报的应用程序所使用的UDP端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为0。这样,接收端的应用程序就不能发送响应了。
2.3.2 目的端口
接收端计算机上UDP软件使用的端口,占据16位。
2.3.3 长度
该字段占据16位,表示UDP数据报长度,包含UDP报文头和UDP数据长度。因为UDP报文头长度是8个字节,所以这个值最小为8。
2.3.4 校验值
该字段占据16位,可以检验数据在传输过程中是否被损坏。校验值为伪头部,头部,data三部分校验和。
2.3.4.1 伪头部
UDP校验和中的伪头部,并非UDP报文中的有效数据,是提取了IP数据报中的源IP,目的IP信息并加上协议等字段构造的数据。伪头部在实际网络传输中,仅用作校验和计算使用,并不发送!因此称为伪头部。事实上在TCP校验和计算中也用到了伪头部,与UDP一致。
伪首部(占用12个字节)为:
- 4个字节的源IP地址;
- 4个字节的目的IP地址;
- 1个字节的0;
- 一个字节的数字17;
- 以及占用2个字节UDP长度;
接收端进行的校验和与UDP报文中的校验和相与,如果无差错应该全为1。如果有误,则将报文丢弃或者发给应用层、并附上差错警告。
2.3.4.2 校验和算法
UDP计算校验和的方法和计算IP数据报首部校验和的方法类似,不同的是IP数据报的校验和只校验IP数据报的首部,而UDP的校验和是把首部和数据部分一起都校验。
- 首先将把全0写入校验和字段。
- 把伪首部,UDP首部,UDP数据部分都看做许多个16位组成的字符串。若UDP数据部分不是偶数个字节,则补充0(但此补充字节不发送)。
- 按二进制反码计算出这些16位字的和。
- 将得出的和求反码,并写入校验和字段。