目录
1、UDP 协议(用户数据报协议)
协议特点
报文首部格式
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 22 | SSH 远程登录与会话 |
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 路由协议 |