深入理解传输层协议UDP/TCP
传输层
负责接收应用层的数据并通过网络层发送到网络的另一端。主要的传输层协议就是UDP
和TCP
协议
再谈端口号
因为传输层要和网络层打交道,常常要使用IP
和端口号
,IP
协议我们以后再详谈,我们先再深入学习下端口
端口
是网络协议中的概念,是一个uint16_t
的无符号整型,范围是0~65535
,显然还是一个有限资源。
端口号划分
0~1023
: 知名端口号,HTTP
,FTP
,SSH
等这些常用的应用层协议会固定使用里面的端口号1024~65535
:操作系统动态分配的端口号。客户端自动分配的端口号就在这个范围。
知名端口号
为了方便使用,人们约定了常用的服务器使用固定的端口号
服务器类型 | 端口号 |
---|---|
SSH | 22 |
FTP | 21 |
telnet | 23 |
HTTP | 80 |
HTTPS | 443 |
UDP协议
全称 User Datagram Protocol
, 即用户数据报协议
格式
UDP协议的格式十分简单,就是固定的8字节
报头,组成结构如下
UDP长度
这一部分的值表示整个报文的长度,单位是字节,包括UDP报头和数据段。16位UDP长度
支持的最大长度是64K
然而64KB
在如今的互联网环境下已经很小了。当我们需要用UDP传超过64KB的数据时,需要在应用层手动分包并多次发送,然后再接收端手动拼装。
校验和
由于长距离网络传输是不可靠的(可能因为种种不稳定因素导致内容被错误删改),所以UDP使用了校验和
的方式提高本次传输的可靠性。它用于校验本次UDP数据报的各种信息是否完整。如果校验和出错,会直接丢弃本次数据报
UDP的特点
UDP传输的过程类似于寄信。只往目的地址寄一次,中间丢了不管,中间坏了就扔了,完整到了就一次性收取全部内容。
- 无连接:知道目的的
IP
和端口号
就直接进行传输, 不需要建立连接 - 不可靠:没有
确认机制
, 没有重传机制
; 如果因为网络故障该段无法发到对方,UDP
协议层也不会给应用层返回任何错误信息 - 面向数据报:强制一次收发一整个数据报。否则剩下的部分会被丢弃
UDP的缓冲区
- 发送缓冲区:UDP没有真正意义上的发送缓冲区. 调用
sendto
会直接交给内核
, 由内核将数据传给网络层协议进行后续的传输动作 - 接收缓冲区:UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃
常见的基于UDP的应用层协议
- NFS:网络文件系统
- TFTP:简单文件传输系统
- DHCP:动态主机协议配置
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
TCP协议
TCP全称为 传输控制协议(Transmission Control Protocol
). 人如其名, 要对数据的传输进行一个详细的控制
格式
- 源/目的端口号
- 32位序号/32位确认号
- 4位TCP报头长度:表示该TCP头部有多少个
4字节
。所以TCP头部最大长度是4 x 15 = 60
- 6位标志位
URG
:紧急指针是否有效ACK
:确认号是否有效PSH
:提示接收端应用程序立刻从TCP缓冲区把数据读走RST
:对方要求重新建立连接,我们把携带RST标识的称为复位报文段
SYN
:请求建立连接,我们把携带SYN标识的称为同步报文段
FIN
:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
- 16位窗口大小
- 16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分
- 16位紧急指针: 标识哪部分数据是紧急数据;
- 40字节头部选项
TCP协议特点/机制
确认应答机制 ACK
TCP为每个字节的数据都进行了编号,即序列号,用于保证收发数据的顺序一致性
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 supdriver的博客!
评论