传输层协议——TCP、UDP

目录

[1、UDP 协议(用户数据报协议)](#1、UDP 协议(用户数据报协议))

协议特点

报文首部格式

[2、TCP 协议(传输控制协议)](#2、TCP 协议(传输控制协议))

协议特点

报文首部格式

TCP连接建立时的三次握手

TCP拆除连接的四次挥手

TCP的流量控制

TCP的拥塞控制

3、传输层端口号

三类端口号

一些熟知端口号


|----------|------------|----------|----------|--------|---------------|
| 协议类型 | 是否面向连接 | 是否可靠 | 传输效率 | 开销 | 通信方式 |
| UDP | 否 | 否 | 高 | 小 | 单点/多点 到 单点/多点 |
| TCP | 是 | 是 | 低 | 大 | 点到点 |

1、UDP 协议(用户数据报协议)

协议特点

  • 无连接
  • 面向报文
  • 首部开销小(8字节)
  • 尽最大努力交付,不保证可靠,不提供拥塞控制
  • 支持 一 or 多 对 一 or 多 通信

报文首部格式

2、TCP 协议(传输控制协议)

协议特点

  • 面向字节流(将应用层交下来的数据当成字节来处理,并对其进行相应的编号)
  • 面向连接
  • 每一条 TCP 连接只有两个端点(一对一的连接)
  • 保证可靠交付
  • 可以全双工通信

报文首部格式

源端口和目的端口的取值为0~65535;

**序号(seq)**表示本报文段的数据的第一个字节的序号,取值为 0 ~ - 1;

**确认号(ack)**表示期望收到对方下一个报文段的第一个数据字节的序号,取值为 0 ~ - 1;

数据偏移 表示TCP首部的长度,可以方便地识别出数据段的起始位置,最小长度为5(0101),单位是字节,则首部的最小长度为20字节;

紧急指针 当 URG 位为 1 时,此字段有效,并会指出需要紧急发送的数据;

填充字段 长度可变,用于确保TCP报文的首部长度为 4 字节的整数倍;

|--------|-----------|---------------------------------------------|
| 字段 | 占位 | 说明 |
| 控制字段 | URG(1bit) | 紧急位;当为1时表示有数据要紧急发送 |
| 控制字段 | ACK(1bit) | 确认位;这里是大写,与确认号(小写ack)区分开来;当为1时确认字段有效,表示肯定应答 |
| 控制字段 | PSH(1bit) | 推送位;置为1时,立即发送TCP报文 |
| 控制字段 | RST(1bit) | 复位位;置为1时表示TCP连接有严重错误,需要重新建立连接;也可以用于拒绝一个连接 |
| 控制字段 | SYN(1bit) | 同步位;置为1时,表示正在建立一个TCP连接 |
| 控制字段 | FIN(1bit) | 终止位;置为1时,表示正在释放一个TCP连接 |
| 窗口 | 16 bit | 接收空闲窗口值,用于实现TCP流量控制 |

TCP连接建立时的三次握手

三次握手的作用是为了避免产生错误的连接

主机 A 向服务器 B 发送 SYN 表示请求建立一个 TCP 连接,即便是没有数据,也要消耗一个 seq。此时直到没有收到目标服务器第一次回应前,主机 A 处于SYN-SENT 状态。

服务器 B 在没有接收到TCP连接请求前,属于 LISTEN 的监听状态。

服务器响应给主机 A SYN,表示也向主机 A 请求建立一个连接,ACK=1 表示同意了刚才主机 A 的连接请求,服务器 B 也要消耗一个 seq,seq = y,ack = x + 1,表示确认了刚刚主机发送过来的数据内容,并且提出期望,希望主机 A 下次发送消息给服务器 B 时的 seq 为 x + 1。此时服务器 B 需要等待主机 A 的响应,此时也转变到 SYN-SENT 状态。

主机 A 接收到服务器B的回应,再回应服务器 B ,ACK=1 表示确认了服务器 B 的TCP建立请求,响应服务B的期望,即便展示还没有数据,也发送一个seq,seq = x + 1,同时 ack = y + 1,也是对刚刚服务器 B 发送过来的内容的一个确认,同时也提出期望,希望服务型下次发送消息时的 seq 为 y + 1。同时将状态设置为 ESTABLISHED,表示已经建立起连接。

服务器 B ,收到主机 A 的响应,确认无误后也将状态设置为 ESTABLISHED,表示TCP连接成功建立。

此时主机 A 和服务器 B 已经建立起了一条TCP连接,双方可以正常进行数据传送。

|-------------|------------------------|
| 状态 | 说明 |
| SYN-SENT | 发送了SYN请求,请求建立TCP连接的第一步 |
| LISTEN | 监听SYN报文的状态 |
| SYN-RCVD | 接收到SYN请求报文后的状态 |
| ESTABLISHED | TCP连接建立成功的状态 |

TCP拆除连接的四次挥手

当主机 A 发送 FIN = 1 (断开连接)标志后,它会进入 FIN-WAIT-1 状态,等待对方确认关闭。当主机收到对方的 ACK = 1(确认)标志后,主机 A 会进入 FIN-WAIT-2 状态。此时,主机 A 已经断开了到对方的连接,但尚未完全断开TCP连接,仍等待对方发送 FIN 标志以确认对方的关闭。

只有在主机 A 收到对方的 FIN 标志并发送 ACK 标志确认后,才会进入 TIME-WAIT 状态,此时主机才真正关闭了TCP连接。

|---------------|-------------------------|
| 状态 | 说明 |
| FIN-WAIT-1 | 发送了第一个 FIN 请求,等待对方确认 |
| FIN-WAIT-2 | 等待对方的 FIN 请求 |
| CLOSE-WAIT | 等待自己进程发出断开连接的命令 |
| LAST-ACK | 等待对方最后一次确认 |
| TIME-WAIT | 等待足够的时间,以确保对方接收到了确认 |
| CLOSED | 关闭状态 |

TCP的流量控制

流量控制是针对两端之间的通信的。考虑的是发送方和接收方之间的数据传输速率之间的差异。

TCP流量控制是通过可变大小的滑动窗口机制实现的。即 让数据发送端传输的速率不要太快,让数据接收端来得及接收。

数据传输窗口 win 在连接建立时由双方商定。但在通信的过程中,数据接收端可根据自己的资源情况,随时动态地调整对方的传输窗口大小。(上面经过协商后,窗口大小为3)

接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。

接收方通常会在接收到数据后立即发送一个 ACK 报文,确认收到数据并通知发送方此时窗口的大小。如果接收方的缓冲区已满,它会将窗口大小设置为0,发送方就会停止发送数据。当接收方处理完数据后,它会将窗口大小设置为一个大于 0 的值,并发送 ACK 报文通知发送方,以便发送方继续发送数据。

TCP的拥塞控制

拥塞控制是针对整个网络的通信而言的,考虑的是网络中的各个路由器和线路的资源利用情况,以避免因过多的数据流量导致网络拥塞。

四种常见的拥塞控制方法:

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

拥塞窗口(cwnd):是发送方维护的一个状态变量,其大小取决于网络的拥塞程度,并且会动态变化;

慢开始门限(ssthresh):为了防止拥塞窗口 cwnd 的增长过大而引起网络拥塞所设置的一个门限值;

|----------------------|-----------------------|
| cwnd < ssthresh | 执行慢开始算法 |
| cwnd = ssthresh | 可以使用慢开始算法,也可以使用拥塞避免算法 |
| cwnd > ssthresh | 使用拥塞避免算法 |

慢开始:每经过一个传输轮次,cwnd 的值都会加倍,从小到大增大 cwnd;

拥塞避免:每经过一个传输轮次,cwnd 的值都会加 1,从小到大缓慢增大 cwnd;

快重传:接收方每收到一个失序报文段后就会立即发出重复确认 ACK,若发送方一连收到三个重复确认 ,就会立即重传对方尚未收到的报文段。因此能尽早重传未被确认的报文,而不是等待超时;

快恢复:当发送方连续收到三个重传确认 ACK 时 ,就执行乘法减小算法,把门限值减半 (当前 cwnd值的一半),同时把cwnd 值设置为减半后的门限值 ,并执行拥塞避免算法;

乘法减小:出现超时(可能是拥塞时),则 ssthresh 减半(当前 cwnd 值的一半),同时执行慢开始算法;

加法增大:执行拥塞避免算法,使 cwnd 增大;

如上图,初始慢开始门限为16,cwnd 从 1 开始,每当发送方接收到一个 ACK 确认报文时,都会使 cwnd 增大(在达到门限值前使用慢开始算法增大)。

[① ~ ②] 当到达门限值后,改用避免拥塞算法来缓慢增大 cwnd;

[② ~ ③] cwnd = 24 时发生超时,则门限减半,即 ssthresh = 12,然后下一次接收到 ACK 确认报文时,cwnd 从 1 开始,使用慢开始算法来递增;

[③ ~ ④] cwnd = 12 时,到达了门限,则改用拥塞避免算法缓慢递增;

[④ ~ ⑤] 到 ④ 时,cwnd = 16,发送方一连收到三个重复确认,则门限减为当前 cwnd 的一半,即 ssthresh = 8,而 cwnd 变为与门限值一致;

[⑤ ~] 由于cwnd = ssthresh,开始采用避免拥塞算法来进行增加;

3、传输层端口号

三类端口号

  • 熟知端口 0 ~ 1023
  • 登记端口 1024 ~ 49151
  • 客户端口号 49152 ~ 65535

一些熟知端口号

|---------|-------------------|
| 端口号 | 服务类型 |
| TCP 20 | 文件传输协议(数据) |
| TCP 21 | 文件传输协议(控制) |
| TCP 23 | Telnet 终端仿真协议 |
| TCP 25 | SMTP 简单邮件发送协议 |
| TCP 80 | 超文本传输协议(HTTP) |
| TCP 110 | POP3 服务器(邮箱接收服务器) |
| TCP 443 | 安全超文本传输协议(HTTPS) |

|---------|-----------------|
| 端口号 | 服务类型 |
| UDP 53 | 域名服务器(DNS) |
| UDP 67 | DHCP(服务端) |
| UDP 68 | DHCP(客户端) |
| UDP 69 | 简单超文本传输协议(TFTP) |
| UDP 161 | SNMP(轮询) |
| UDP 162 | SNMP(陷阱) |
| UDP 520 | RIP 路由协议 |

相关推荐
xiaoxiongip6663 分钟前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
JaneJiazhao7 分钟前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl
JaneJiazhao8 分钟前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
CXDNW9 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
无所谓จุ๊บ1 小时前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
道法自然04021 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
EasyCVR2 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
城南vision2 小时前
计算机网络——HTTP篇
网络协议·计算机网络·http
明月看潮生3 小时前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学