二、TCP

流量控制

概念

流量控制:控制发送方发送速率不要太快,使自己能够接收

滑动窗口机制

1)使用类似于选择重传协议的规则进行传输

2)接受方回复包含三条“ACK”为 1 表示正确接收,“ack”表示在当前位置之前的数据都正确接收,“rwnd”表示调节发送方的发送窗口大小为该值

3)当发送方收的接收方的“rwnd”为 0 时,启动持续计时器,每超时一次则向接受窗口发送一次零窗口探测报文

拥塞控制

概念

对某一网络资源需求超过了所能提供的部分,网络性能就会下降

拥塞控制算法

慢开始

1.拥塞窗口(cwnd):

1)值取决于网络的拥塞程度,动态变化,发送窗口(swnd)= 拥塞窗口(cwnd)

2)只要没有出现拥塞,cwnd 就增大一倍,出现拥塞就减小一些

2.判断拥塞:是否出现超时重传

3.慢开始门限(ssthresh):

1)当$ cwnd<ssthresh $时,使用慢开始算法

2)当$ cwnd>ssthresh $时,停止慢开始算法,使用拥塞避免算法

3)当$ cwnd=ssthresh $时,既可以使用慢开始算法,又可以使用拥塞避免算法

注意:“慢开始”是指一开始向网络注入的报文段少,并不是指 cwnd 增长速度慢

拥塞避免

1)拥塞避免算法生效时,cwnd每次增加 1

2)网络出现拥塞时,将 ssthresh 更新为 cwnd 的一半,将 cwnd 值减小为 1,开始执行慢开始算法

注意:“拥塞避免”不能完全避免拥塞,而是将 cwnd 控制为线性增长,出现拥塞时降低传输能力

快重传

个别报文段丢失时,实际网络未发生拥塞,导致发送方误认为发生了拥塞,启动慢开始算法,降低了传输效率

快重传是不等“超时重传计时器”超时时再重传,另发送方提前重传

原理:

1)接收方不等自己发送数据时才捎带确认,而是立即发送确认

2)收到了失序的报文段也要继续发送之前的确认,进行重复确认

3)当发送方收到了3个连续的重复确认,就会立即重传

快恢复

当执行完快重传算法后,执行快恢复算法而不是慢开始算法

快恢复:将 ssthresh 与 cwnd 调整为原来的一半,开始执行拥塞避免算法

图像

超时重传时间选择

计算公式

$ RTT_s $:加权平均往返时间

1)第一个$ RTT_{s1}=RTT_1 $

2)$ 新RTT_{s}=(1-\alpha)\times旧RTT_s+\alpha\times新RTT样本 $

$ 0\le \alpha<1 $,标准推荐$ \alpha=\frac{1}{8} $

$ RTT_d $:RTT偏差的加权平均时间

1)第一个$ RTT_{D1}=\frac{RTT_1}{2} $

2)$ 新RTT_D=(1-\beta)\times旧RTT_D+\beta\times|RTT_s-新RTT样本| $

$ 0\le\beta<1 $,标准推荐$ \beta=\frac{1}{4} $

$ RTO $:超时重传时间

$ RTO=RTT_s+4\times RTT_D $

超时数据包的时间测量

超时重传的时间直接丢弃,不记录。并把 RTO 增大一些,如变为原来的两倍

首部格式

1)源端口号与目的端口号:发送方进程与接收方进程的端口号

2)序号:占 32 bit,指本 TCP 报文段数据载荷中的第一个字节位于总数据的字节序号,序号增加到最后一个后,下一个序号又回到零。

3)确认号:占 32 bit ,指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。序号增加到最后一个后,下一个序号又回到零。

4)数据偏移:占 4 bit,以 4 字节为单位。指出 TCP 报文的数据载荷部分距离 TCP 报文段的起始处有多远。因为首部固定 20 字节,扩展最多 40 字节,所以范围为$ [(0101)_2,(1111)_2] $

5)保留:占 6 bit,保留今后使用,目前全部置为 0

6)紧急标志位 URG :取值为 1 时,“紧急指针”部分生效

7)确认标志位 ACK:取值为 1 时,确认号字段生效,建立连接后所有的TCP报文段必须将 ACK 置为 1

8)推送标志位 PSH:接收方的 TCP 收到 PSH 为 1 的报文段后会尽快上交应用,不用等缓存填满再上交

9)复位标志位 RST:复位 TCP 连接。当 RST 为 1 时,表明 TCP 连接出现了异常,必须释放连接,然后再重新建立连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个 TCP 连接

10)同步标志位 SYN:在建立 TCP 连接时用来同步序号,为 1 时不能携带数据,但要消耗一个序号

11)终止标志位 FIN:用来释放 TCP 连接

12)窗口:占 16 bit,以字节为单位。指出发送本报文段的一方的接收窗口。作为接收方让发送方设置发送窗口的依据,用于流量控制

13)校验和:占 16 bit,用于校验是否出现误码

14)紧急指针:占 16 bit,以字节为单位,指明紧急数据的长度。紧急数据之后是普通数据。(发送方有紧急数据时,将紧急数据插队到发送缓存的最前面,立刻封装一个 TCP 报文段发送。)

15)选项:可以附加其他信息,如窗口扩大选项、时间戳选项等

16)填充:由于选项长度可变,填充为了确保 TCP 首部的字节长度是 4 的倍数

TCP连接

TCP分为以下三个阶段

1)建立 TCP 连接

2)数据传送

3)释放 TCP 连接

连接建立——三次握手

seq 与 ack

1)无论发送方还是接收方 seq 初始状态都是随机序列,往后每发送 x 字节的数据就加 x

2)ask每次都是对方上次发送的seq+1

TCP 规定 SYN 为 1 时不能携带数据,但要消耗一个序号。普通报文若不携带数据则不用消耗序号

三次握手过程

1.服务端处于监听状态

2.第一次握手:

1)客户端发送建立连接请求,将 SYN 置为 1 表示请求建立连接

2)seq 为客户端随机生成的序列号

3.第二次握手:

1)服务器发送确认消息并向客户端建立连接,将 SYN 置为 1 表示请求建立连接

2)将 ACK 置为 1 表示接收到了上一个请求

3)seq 为服务端随机生成的序列号,假设为 y

4)ask 为之前客户端seq +1 即为 x+1

4.第三次握手:

1)客户端发送确认消息,ACK 置为 1 表示确认收到建立请求的消息

2)seq 为第一次握手的 seq +1 即为 x+1

3)ack 为第二次握手服务器端的 seq +1 即为 y+1

连接释放——四次挥手

1.第一次挥手:

1)客户端发送释放连接请求,FIN 置为 1 表示这是一个释放连接请求

2)ACK 置为 1 表示对上一个 TCP 报文段的确认

3)seq:TCP 客户端进程已传送的数据的最后一个字节的序号+1,假设为 u

4)ask:TCP 客户进程已收到的数据的最后一个字节的序号+1,假设为 v

2.第二次挥手:

1)服务端发送确认消息,ACK 置为 1 表示这是一个确认消息

2)seq:TCP 服务器进程已传送过的数据的最后一个字节的序号+1,即为 v

3)ask:为客户端第一次挥手的seq+1,即为 u+1

注意:此时处于半关闭的状态,如果服务器端还要发送数据,客户端仍要接收

3.第三次挥手:

1)服务端发送剩余数据后,发送释放连接请求,FIN 置为 1 表示这是一个释放连接请求

2)ACK 置为 1 表示对之前消息的去人

3)seq:会增加是因为半关闭状态下服务器又传输了一些数据,假设为 w

4)ask:为客户端第一次挥手的seq+1,仍未 u+1

4.第四次挥手:

1)客户端发送确认消息,ACK置为 1 表示这是一个确认请求

2)seq:设置为u+1

3)ask:设置为 w+1

注意:客户端发送第四次挥手后还要等待 2 倍的 MSL 才会关闭连接,等待时间是为了防止第四次挥手丢失,导致服务端反复重传第三次握手

保活计时器

1)TCP 服务器进程每收到一次 TCP 客户进程的数据,就重新设置并启动保活计时器(2小时定时)

2)若保活计时器超时,TCP 服务器每个 75 秒就会发送一次探测报文段,若连续发送 10 个探测报文段后客户端仍没有响应,则认为客户端发生了故障,就会关闭连接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇