06. 传输层 · UDP · TCP

网络协议从入门到底层原理


提示:本系列文章已经修订完毕,修改了纰漏,优化了文章结构。为了获得更好的阅读体验,请查看以下新专栏或新站点

CSDN 新专栏:
https://blog.csdn.net/keeppromise/category_12489629.html

我的个人博客(Github Page):
https://blog.lens-shrine.top/categories/学习记录:网络协议/

网络互连模型

图01

请求过程

图02

网络分层

图03

传输层(Transport)

图04

UDP

数据格式
图05

UDP长度(Length)

占16位:首部的长度 + 数据的长度

检验和(Checksum)

图06

端口

图07

常用命令 【实践】

netstat –an
查看被占用的端口

netstat –anb
查看被占用的端口、占用端口的应用程序

telnet 主机 端口
查看是否可以访问主机的某个端口

TCP

TCP的几个要点:

  • 可靠传输
  • 流量控制
  • 拥塞控制
  • 连接管理(建立连接、释放连接)

数据格式:
图08

首部

首部 - 序号

图12

首部 - 确认号

图13

首部 - 数据偏移

  • 占4位,取值范围是 0x0101 ~ 0x1111(5~15)
  • 数据偏移 * 4 = 首部长度(Header Length)
  • 首部长度是 20 ~ 60 字节

首部 - 保留

  • 占6位,目前全为0

小细节: 有些资料中,TCP首部的 保留(Reserved)字段 占3位,标志(Flags) 字段占9位(Wireshark中也是如此)
图09
图10

首部 - 标志位

标志位(Flags)

URG(Urgent)

  • 当 URG = 1 时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送

ACK(Acknowledgment)

  • 当 ACK = 1 时,确认号字段才有效

PSH(Push)

RST(Reset)

  • 当 RST = 1 时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接

SYN(Synchronization)

  • 当 SYN = 1、ACK = 0 时,表明这是一个建立连接的请求
  • 若对方同意建立连接,则回复 SYN = 1、ACK = 1

FIN(Finish)

  • 当 FIN = 1 时,表明数据已经发送完毕,要求释放连接

首部 - 窗口

图14

首部 - 检验和

检验和(CheckSum)
跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据。
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层。
图11

要点 - 可靠传输

可靠传输是为了保证包的完整性,当有丢包、受到三次重复确认等情况,就会重新发包。

停止等待ARQ协议

ARQ(Automatic Repeat–reQuest),自动重传请求。
图15

图16

疑问: 若有个包重传了N次还是失败,会一直持续重传到成功为止么?

  • 这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送 reset报文(RST)断开TCP连接。 图22

连续ARQ协议 + 滑动窗口协议

图17
如果接收窗口最多能接收4个包,但发送方只发了2个包,接收方如何确定后面还有没有2个包?
等待一定时间后没有第3个包,就会返回确认收到2个包给发送方。

图18

SACK(选择性确定)

SACK(Selective acknowledgment,选择性确认)技术

  • 告诉发送方哪些数据丢失,哪些数据已经提前收到
  • 使TCP只重新发送丢失的包,不用发送后续所有的分组
    图19
    可靠传输图示:
    图20
    图21
    思考:
    为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
    图23

要点 - 流量控制

图01

流量控制 - 特殊情况
图02

流量控制图示
图03

要点 - 拥塞控制

图04

方法

图05

慢开始(slow start)

图06
图07
cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK),cwnd就成倍增长(指数级)

拥塞避免(congestion avoidance)

图08

快重传

图09
图10

快恢复

图11

快重传 + 快恢复

图12

发送窗口的最大值

发送窗口的最大值swnd = min(cwnd, rwnd)

  • 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
  • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值

序号、确认号(详细)

图01
图02
图03
图04
图05
序号,确认号——相对:
图06
序号,确认号——原生:
图07

要点 - 建立连接

三次握手

图08
状态解读:

  • CLOSED:client处于关闭状态
  • LISTEN:server处于监听状态,等待client连接
  • SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到 ESTABLISHED 状态
  • SYN-SENT:表示client已发送SYN报文,等待server的第2次握手
  • ESTABLISHED:表示连接已经建立

前2次握手的特点:
图09

疑问

图10

采用 “三次握手” 的办法可以防止上述现象发生
例如上述情况,client没有向 server的确认 发出确认,server由于收不到确认,就知道client并没有要求建立连接。

如果第3次握手失败了,会怎么处理?

  • 此时server的状态为 SYN-RCVD,若等不到client的 ACK,server会重新发送 SYN+ACK 包
  • 如果server多次重发 SYN+ACK 都等不到client的 ACK,就会发送 RST包,强制关闭连接

图11

要点 - 释放连接

四次挥手

图01
状态解读:

FIN-WAIT-1表示想主动关闭连接

  • 向对方发送了FIN报文,此时进入到FIN-WAIT-1状态

CLOSE-WAIT表示在等待关闭

  • 当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态
  • 在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方

FIN-WAIT-2只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文

CLOSING一种比较罕见的例外状态

  • 表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文
  • 如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态
  • 表示双方都正在关闭连接

LAST-ACK被动关闭一方在发送FIN报文后,最后等待对方的ACK报文

  • 当收到ACK报文后,即可进入CLOSED状态了

TIME-WAIT表示收到了对方的FIN报文,并发送出了ACK报文,就等 2MSL 后即可进入CLOSED状态了

  • 如果FIN-WAIT-1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME-WAIT状态,而无须经过FIN-WAIT-2状态

CLOSED关闭状态

由于有些状态的时间比较短暂,所以很难用 netstat 命令看到,比如SYN-RCVD、FIN-WAIT-1等

疑问

图02

细节

图03

图04

长连接、短链接

如果建立连接后不需要进行数据交互就会关闭,那就是短连接。
如果建立连接后需要进行数据交互以后再关闭,那就是长连接。

TCP完整流程

1.
图05
2.
图06

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值