传输层的作用

首先在讲TCP/IP协议族之前,我们先来了解一下传输层。

  1. 传输层提供面向连接和无连接的服务(TCP/UDP)
  2. 维护连接状态
  3. 对数据进行分段和封装(网络只能发送长度有限的数据包)
  4. 多路复用(端口号的概念呢,一个IP地址对应多个应用程序或服务)
  5. 可靠传输(对错误、丢失、乱序的包检测纠错)
  6. 流量控制(对接收方的数据接收速率进行协调,避免浪费)

什么是TCP、UDP

TCP(Transfer Control Protocol)传输控制协议
UDP(User Datagram Protocol)用户数据报文协议
两者都是TCP/IP协议族中最重要协议之一
TCP是面向连接的可靠传输层协议,一对一的通信
UDP是无连接的传输协议,我们看视频什么的都是基于UDP流试传输数据

TCP的特点

  • 三次握手

通过三次握手来建立可靠连接

  • 端口号

可以用端口号来标识上层协议和服务,实现网络多路复用

  • 完整性校验

(Checksum)校验和计算,保证了接受方能检测到传输过程中可能出现的差错

  • 确认机制

对于正确收到的数据包接收方通过应答通过发送方,超过一段时间没有收到应答则重传

  • 序列号

所有的数据都拥有唯一的序列号,通过序列号来将数据进行确认、乱序重排

  • 窗口机制

可以通过调节抽象的窗口,来限制接收方最大的传输速率,从而控制数据流量

TCP报文格式

TCP头格式
依旧还是老惯例,我们逐层来解释他的意思和作用:

  • Source Port

源端口 - 16Bit
和源IP组合起来使用,对报文表示返回地址

  • Destination Port

目的端口 - 16Bit
对应接受方计算机上的服务、应用程序的端口

  • Sequence Number

序列号 - 32Bit
用来标识源端设备向目的端发送的数据的编号,(相当于一个计数器)

  • Acknowledgement

确认号 - 32Bit
用来标识请求对方下次发送的数据报文的编号

  • Data Offset

数据偏移 - 4Bit
用来标识分片后的数据,在源数据中的位置

  • Reserved

保留位 - 6Bit
暂时还没有其他作用,留着占位,以便以后新增内容

  • Control

控制位 - 6Bit
控制着六个功能的开关
分别是URGACKPSHRSTSYNFIN

  • URG

紧急指针

  • ACK

确认字段标志

  • PSH

提交缓存数据

  • RST

复位开关(可以用来强行中断TCP连接)

  • SYN

握手开关

  • FIN

结束开关

  • Windows

窗口尺寸 - 16Bit
用于标识自己期望收到的数据字节

  • Checksum

校验和 - 16Bit
对源数、目的据计算产生的结果,源目数据计算出来的应该是相等,数据才是完整的

  • Urgent Pointer

紧急指针 - 16Bit

  • Options

可选项

  • Padding

填充

加入额外的数据,保证TCP头部是32位的整倍数

端口号的概念

IP网络中,通常一个IP地址标识一个主机,但是主机上有多个进程服务要被其他网络所访问,要标识这些程序、服务就引入了TCP/UDP端口号,用来标识程序或服务
协议号TCP:6
协议号UDP:17
IP/UDP端口号
端口的取值范围是0~65535
其中0-1023端口有IANA号码分配机构统一管理
1024-65535为我们的随机端口
几个常见应用的端口号:
Telnet:23/TCP
FTP:20/21/TCP(20数据传输,21连接控制)
HTTP:80/TCP
HTTPS:443/TCP
SMTP:25/TCP
DNS:53/UDP
TFTP:69/UDP
SNMP:161/UDP
BootP:67/68/UDP

TCP三次握手

TCP通过三次握手来建立可靠连接

  1. 由发起方 HostA 向被叫方 HostB 发出连接请求。将段的序列号标为 a,SYN 置位,由于是双方发的第一个包,ACK 无效。
  2. HostB 收到连接请求后,读出序列号为 a,发送序列号为 b 的包,同时将 ACK 置为有效,将确认号置为 a+1,同时将 SYN 置位。
  3. HostA 收到 HostB 的连接确认后,对该确认再次作确认。HostA 收到确认号为 a+1、序列号为 b 的包后,发送序列号为 a+1、确认号为 b+1 的段进行确认
  4. HostB 收到确认报文后,连接建立

PS:看文字容易搞混,最好还是看流程图,在配合抓包测试
三次握手

TCP的四次挥手

TCP在控制段中开启FIN功能来关闭一个TCP连接

  1. HostA 要求终止连接,发送序列号为 p 的段,FIN 置为有效,同时确认此前刚收到的
    段。
  2. HostB 收到 HostA 发送的段后,发送 ACK 段,确认号为 p+1,同时关闭连接。
  3. HostB 发送序列号为 q 的段,FIN 置为有效,通知连接关闭。
  4. HostA 收到 HostB 发送的段后,发送 ACK 段,确认号为 q+1,同时关闭连接

还是和三次握手相似,如果要强制关闭连接,只需要开启RST功能即可,无需进行四次挥手就可断开连接。
四次挥手

TCP重传机制

当其中一个数据丢失时,被接收方只需要向接收方单独发送丢失数据的请求即可
重传机制

TCP滑动窗口机制

通过告知对方本机数据的接收能力,来实现对数据流量的控制
当TCP发送重传后,会主动缩减窗口尺寸
当TCP稳定传输时,会逐渐增大窗口尺寸
滑动窗口

UDP报文格式

相比于TCP而言UDP的报文格式就简单了许多
UDP报文格式
这里我们只对新出现的条目做解释,其他条目和TCP的解释一样

  • Length

长度 - 16Bit
里面包含了UDP头部和数据在整改UDP数据报文中的长度,单位字节

TCP与UDP的对比

对比图
TCP更适用于对于数据完整性要求较高,对数据传输延低的场景
UDP更适用于对传输延时高,但对数据完整性要求较低的场景(视频流的传输,音频流的传输都是基于UDP)