zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

[NetWork] TCP/UDP 基本原理

2023-02-18 16:34:50 时间

传输层的作用

首先在讲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报文格式

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

  • **Source Port **

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

  • Destination Port

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

  • Sequence Number

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

  • Acknowledgement

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

  • Data Offset

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

  • Reserved

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

  • **Control **

<code>控制位 - 6Bit</code> 控制着六个功能的开关 分别是<code>URG</code><code>ACK</code><code>PSH</code><code>RST</code><code>SYN</code><code>FIN</code>

  • URG

紧急指针

  • ACK

确认字段标志

  • PSH

提交缓存数据

  • RST

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

  • SYN

握手开关

  • FIN

结束开关

  • Windows

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

  • Checksum

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

  • Urgent Pointer

<code>紧急指针 - 16Bit</code>

  • Options

<code>可选项</code>

  • Padding

<code>填充 </code>

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

端口号的概念

IP网络中,通常一个IP地址标识一个主机,但是主机上有多个进程服务要被其他网络所访问,要标识这些程序、服务就引入了TCP/UDP端口号,用来标识程序或服务 协议号TCP:6 协议号UDP:17

端口的取值范围是0~65535 其中0-1023端口有IANA号码分配机构统一管理 1024-65535为我们的随机端口 几个常见应用的端口号: <code>Telnet:23/TCP</code> <code>FTP:20/21/TCP</code>(20数据传输,21连接控制) <code>HTTP:80/TCP</code> <code>HTTPS:443/TCP</code> <code>SMTP:25/TCP</code> <code>DNS:53/UDP</code> <code>TFTP:69/UDP</code> <code>SNMP:161/UDP</code> <code>BootP:67/68/UDP</code>

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的报文格式就简单了许多

这里我们只对新出现的条目做解释,其他条目和TCP的解释一样

  • Length

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

TCP与UDP的对比

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