传输层负责接收应用层的数据并通过网络层发送到网络的另一端。主要的传输层协议就是UDPTCP协议

再谈端口号

因为传输层要和网络层打交道,常常要使用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为每个字节的数据都进行了编号,即序列号,用于保证收发数据的顺序一致性