传输层协议头分析
文章目录
- 传输层协议头分析
-
- 一、前言
- 二、传输层概述
-
- [2.1 传输层的作用](#2.1 传输层的作用)
- [1.2 TCP/IP运输层中的两个重要协议](#1.2 TCP/IP运输层中的两个重要协议)
-
- [1.2.1 TCP](#1.2.1 TCP)
- [1.2.2 UDP](#1.2.2 UDP)
- [1.2.3 TCP VS UDP](#1.2.3 TCP VS UDP)
- [1.3 Internet中典型应用使用的传输层协议](#1.3 Internet中典型应用使用的传输层协议)
-
- [1.4 传输层端口号](#1.4 传输层端口号)
- 三、UDP报文段格式
- 四、TCP报文段格式
- 五、小结
一、前言
今天,我们先来了解一下传输层的协议头~TCP到底是如何实现可靠传输的(超越了UDP)嘞?
二、传输层概述
先前讲了传输层提供了端到端的服务,分为可靠和不可靠,这些都是由传输层来实现的,主要就是靠协议头。正是TCP比UDP的协议头多了很多字段,才造成TCP是可靠传输,UDP是不可靠传输。今天,我们来深入剖析一下~
2.1 传输层的作用
计算机网络体系结构中的物理层、数据链路层和网络层 ,它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
网络层:把异构的网络的身份信息统一了
-
提供多台主机应用进程之间的端到端的传输行为
把网络层收到的主机信息和主机中的进程实现映射关系
-
为不可靠的网络层提供了可选的可靠传输服务(可靠/不可靠)
稳定传输必然需要缓存。
在网络层需不需要保证稳定传输呢?网络层如果要保证稳定传输,就意味着要在所有骨干网中的路由器建立大量的缓存。

举个例子:如果主机A和主机B之间是稳定传输(可靠传输),就需要主机A和路由器R1进行发送确认,发送确认的过程肯定涉及重传 ,主机A暂存很正常,路由器R1和路由器R2之间要保证正常,R1就需要有大量的缓存,路由器就需要大量的存储空间,成本也就随之上升,功耗也会很高。
因此网络层不需要保证可靠传输。
1.2 TCP/IP运输层中的两个重要协议
1.2.1 TCP
-
传输控制协议 (Transmission Control Protocol,TCP)为上层提供的是面向连接 的可靠的数据传输服务
面向连接:通信双方建立队列(管道,就像电话线),数据是有序的、无丢失的,就是可靠。(必须是一对一的)
-
使用TCP通信的双方,在传送数据之前必须首先建立TCP连接 (逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
面向连接就需要建立连接,这里的建立是逻辑建立的(不是链路上的链路交换)。
这里也需要开销。
-
TCP为了实现可靠传输,就必须使用很多措施,例如:TCP连接管理、确认机制、超时重传(可靠 )、流量控制 以及拥塞控制等。
可见要实现可靠传输,网络开销很大。
-
TCP的实现复杂,TCP报文段的首部比较大、占用处理机资源比较多。
1.2.2 UDP
- 用户数据报协议(User DataGram Protocol,UDP)为其上层提供的是无连接的不可靠的数据传输服务
- UDP不需要实现可靠传输,因此不需要使用实现可靠传输的各种机制
- UDP的实现简单,UDP用户数据报的首部比较小
用UDP传100M的数据
打包 + 发送:UDP header + 100M data
IP:拆包(拆成100个)
链路层:物理上的,不会关注丢不丢失(甚至全部丢失都行)
下层不关注可靠与否,才会导致不可靠。转念一想,如果下层加入一些逻辑,可能UDP也会变的可靠。而且相对TCP,更灵活,开销更小。这也是一个发展的趋势。
1.2.3 TCP VS UDP

1.3 Internet中典型应用使用的传输层协议
无论是TCP还是UDP,最终都是为应用层提供服务。换句话说,应用层依赖传输层实现数据的收发。

应用层同样有协议,这个协议就是应用层的数据格式,应用层打包好后,最终还是要交给传输层,加一个传输层的头,继续传输。
解析:
-
DNS:UDP,域名解析。就是输入www.baidu.com,然后就会回给一个百度的IP地址。DNS就是更快、更直接地获取信息。
-
文件传输:原则上都是TCP,但是还有一个TFTP,就是精简的文件传输协议。它的目的是在UDP上实现应用层传输,避免FTP中会有TCP那样有大量的开销。
在某些场合可能会用到,比如:做智能设备开发,但是几乎用不到
-
HTTP:最常用的,一定是TCP
其他做了解即可。。。
1.4 传输层端口号
应用层采用不同的进程号来识别不同的运行程序
A主机:有一个进程号1991
B主机:有一个进程号1991
这两者完全没有任何关系。但是如果让这两个主机通信,如果让进程的PID作为识别标志,就会出现混乱。这个时候IP不一样,为了跟IP分离一下,衍生出了进程号。
- 网路系统识别一个进程:IP:port,要分成两类:src(我)和dest(你)
- 本机系统识别一个进程:进程号
进程和端口是一一对应的,也有可能出现一对多。
比如:tcp_client PID 2000
- connect socket:ip:port1(dest src)
- connect socket:ip:port2
一个进程可以管理多个socket对象,一个socket对象对应一个链接。
-
运行在一台主机上的进程是使用进程标识符(Process Identification,PID)来标识的
- 然而,因特网上的计算机并不是使用统一的操作系统,而不同的操作系统(Windows、Linux、MacOS)又使用不同格式的进程标识符
- 为了使不同操作系统的计算机的应用进程之间能够基于网路进行通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识
-
TCP/IP体系结构的运输层使用端口号来标识和区分应用层的不同应用进程。端口号的长度为16比特,取值范围是0~65535
-
端口号的分类


- FTP:文件传输协议,那就有文件的上传和下载,因此需要两个不同的端口号来维护
- SMTP:邮箱服务
- DNS:采用UDP协议
- DHCP:应用程序的DHCP
三、UDP报文段格式
-
UDP是无连接的,减少了建立和释放连接的开销
-
UDP尽最大能力交付,不保证可靠交付
-
不需要维护复杂的参数,首部只有8个字节(TCP首部至少20字节)


0xC154,切换为十进制是49492,C1是高位,这里的内存原本上是从小到大排列的,本身存在的内存是小内存,但是却把高位放在里面,这就是大端模式(网络上一般都是大端)。因此读的时候应该倒着读
大小端:

低位在低地址:小端;反之,大端
-
UDP长度
- 占16位,首部的长度 + 数据长度
UDP长度其实是可有可无的,IP首部头:首部长度 + 数据长度,当知道UDP长度时,(UDP长度就是首部长度),直接就可以获取数据长度。那为什么还需要UDP长度呢?因为一次处理是4个字节,为了占好位,UDP协议又加了UDP长度。
-
校验和的计算内容:伪首部 + 首部 + 数据
- 伪首部:只参与运算,不参与传输。

-
校验和的目的:伪首部的信息是传输层填充的,这是因为传输层有自己的一套数据结构来进行校验,只有保证所有的信息量是准确的,才会继续传输。
发送端生成伪首部,填入校验和,传输给接收端,接收端也会生成伪首部,对整个数据进行异或,结果为0,就说明是正确的。
四、TCP报文段格式
TCP相对UDP可就复杂多啦~

解析:
-
源端口和目的端口是都有的,不再赘述
-
序号
占32比特,取值范围0~ 2 32 2^{32} 232-1。当序列号增加到最后一个时,下一个序号又回到0(循环)。用来指出本TCP报文段数据载荷的第一个字节的序号。
-
确认号
占32比特,取值范围0~ 2 32 2^{32} 232-1。当确认号增加到最后一个时,下一个确认号又回到0。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
序号和确认号都涉及编址的概念
5B
0 1 2 3 4 序号:0 确认号:5
5B
5 6 7 8 9 序号:5 确认号:10
-
确认标志位ACK
**只有当ACK取值为1时,确认号字段才有效。**ACK取值为0时,确认还字段无效。TCP规定:在TCP连接建立后,所有传送的TCP报文段都必须把ACK置1。
TCP是面向连接的流式套接字。
练习题
3
鉴于乙已经收到了1和3的数据包,但是没有收到2,因此需要甲重传第二个,因此确认序号为500
-
数据偏移
- 占4比特,该字段的取值以4字节为单位
- 指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,这实际上指出了TCP报文段的首部长度

本来4比特只能表示0-15,但是这可实现性不强,就借助了IP协议的计算格式
-
窗口
- 占16比特 ,该字段的取值以字节为单位
- 指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间的大小,这用来表征接收方的接收能力
- 在计算机网络中,经常用接收方的接受能力的大小来控制发送方的数据发送量,这就是所谓的流量控制
-
校验和

-
占16比特
-
用来检查整个TCP报文段在传输过程中是否出现了误码
-

-
-
标志位
- UGR:urgent,紧急指针。
UGR = 1就说明数据域里面有马上要处理的数据,后面还有一个紧急指针的部分,就含有紧急处理数据的首地址。(用的不多) - ACK:ackownlegement,确认指针。只有这个指针为1,确认号才有意义
- PSH:push,推送,传输层本质上是有缓存区的------recv,由一个queue控制,什么时候数据多到可以返回呢?要规定一个状态------full,如果数据很少,就PUSH,如果PUSH为1,就表明推进一个包就立即处理。
- 发送方TCP把PSH置1,就立即建立TCP报文段发出去,不再积累足够多
- 接收方的话,就立即交给应用程序
- RET:reset,复位。
- 如果重传很多次始终收不到确认包,说明另一方有问题,必须释放连接,重新建立连接,也就是重新进行3次握手,进行重连
- 还可以用来拒绝一个非法的 TCP报文段或拒绝打开一个TCP连接
- SYN:synchronize,同步。建立连接的过程出现。(类似:喂?欸)
- FIN:finish,结束。释放连接的起始状态。
- UGR:urgent,紧急指针。
-
选项(长度可变,最大40字节)
-
最大报文段长度MSS选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段的长度
发送数据都是逐段发送,重传也是逐段重传
-
窗口扩大选项:用来扩大窗口,提高吞吐率
-
时间戳选项
- 用于计算往返时间RTT
- 用于处理序号超范围的情况,又称防止序号绕回PAWS
-
选择确认选项:用来实现选择确认功能
-
五、小结
相信经过对于传输层协议头的剖析,你会更加理解关于UDP和TCP的传输本质~



