传输层
传输层是计算机网络体系结构(如OSI模型或TCP/IP模型)中的核心层之一,位于网络层之上、应用层之下。其主要职责是为应用程序提供端到端的可靠或不可靠的数据传输服务,屏蔽底层网络细节(如路由、链路差异),确保数据在不同主机间的有效交付。
核心功能:
进程间通信
通过端口号标识同一主机上的不同应用程序(如HTTP默认端口80),实现多应用共享网络资源。
数据传输控制
- 可靠传输:如TCP协议通过确认应答、重传机制、流量控制和拥塞控制保障数据完整有序。
- 不可靠传输:如UDP协议提供低延迟但无保障的传输,适用于实时视频或语音场景。
数据分段与重组
将应用层的大数据块分割为适合网络层传输的段(Segment),并在接收端重组。
连接管理
TCP通过三次握手建立连接、四次挥手释放连接,确保通信双方状态同步。
端口号
端口号(Port)标识了一个主机上进行通信的不同的应用程序。
知名端口号,要绑定需要超级用户的权限(root):
• ssh 服务器, 使用 22 端口
• ftp 服务器, 使用 21 端口
• telnet 服务器, 使用 23 端口
• http 服务器, 使用 80 端口
• https 服务器, 使用 443
总之尽量避免绑定0-1023的端口号。
一个进程可以绑定多个端口号,但是一个端口号原则上不能绑定多个进程。
UDP协议
UDP报头一定是一个结构体。
UDP协议端格式

一个UDP完整报文,8字节后是报文。如果检验和出错,就会直接丢弃。16 位 UDP 长度, 表示整个数据报(UDP 首部+UDP 数据)的最大长度。
UDP特点
UDP 传输的过程类似于寄信.
• 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接;
• 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP 协议层也不会给应用层返回任何错误信息;
• 面向数据报: 不能够灵活的控制读写数据的次数和数量;
面向数据报
应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并; 用 UDP 传输 100 个字节的数据,如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的 一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字 节。
UDP 的缓冲区
UDP 没有真正意义上的发送缓冲区. 调用 sendto 会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP 具有接收缓冲区. 但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致; 如果缓冲区满了, 再到达的 UDP 数据就会被丢弃;
UDP 的 socket 既能读, 也能写, 这个概念叫做全双工。
使用UDP注意事项
UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数 据最大长度是 64K(包含 UDP 首部). 然而 64K 在当今的互联网环境下, 是一个非常小的数字. 如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。
UDP传过去后,对方就是用这个结构体接受二进制数据,进行二进制的序列化和反序列化,但是不推荐应用层协议这么写,因为客户端的设备不一样,编写语言不一样,大小端问题等会导致结构体大小不同。而内核没有业务,是个纯技术话题,没有引入其他字段,该多少是多少,双方操作系统都是C语言写的,标准化程度高,保证大小端就行。
基于UDP的应用层协议
• NFS: 网络文件系统
• TFTP: 简单文件传输协议
• DHCP: 动态主机配置协议
• BOOTP: 启动协议(用于无盘设备启动)
• DNS: 域名解析协议
OS对报文的管理
在OS内会有struct sk_buff来管理报文:

双向链表管理全部报文,head向前就是增加报头,head向后就是解包,将数据结构交给下一层就行。增加报头就是缓冲区中移动字段。