tcp协议详解

流媒体协议详解_步基的博客-CSDN博客

TCP是面向连接的传输层协议,目标是为用户提供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采用了数据编号、校验和计算、数据确认等一系列措施。

它对传送的每个数据字节都进行编号,并请求接收方回传确认信息(ACK)。发送方如果在规定的时间内没有收到数据确认,就重传该数据。

(1)     数据编号使接收方能够处理数据的失序和重复问题。

(2)     数据误码问题通过在每个传输的数据段中增加校验和予以解决,接收方在接收到数据后检查校验和,若校验和有误,则丢弃该有误码的数据段,并要求发送方重传。

(3)     流量控制也是保证可靠性的一个重要措施,若无流控,可能会因接收缓冲区溢出而丢失大量数据,导致许多重传,造成网络拥塞恶性循环。

(4)     TCP采用可变窗口进行流量控制,由接收方控制发送方发送的数据量。

1 重传问题

1)停等协议

发送方每次只发送一个数据包,同时启动一个定时器,如果定时器超时依然没有收到该数据包的 ACK,则认为丢包并重传该数据包,如果收到 ACK,则重置定时器并发送下一个包;

2)连续 ARQ 协议 & 滑窗协议

发送方维持一个固定大小的发送窗口,位于发送窗口内的所有包可以连续发送出去,中途不需要依次等待对方的 ACK 确认

接收方通常采用积累确认模式,即不必对每一个包逐个发送 ACK,而是在连续收到几个包后,对顺序到达的最后一个包序号发送 ACK,表明该数据包及之前的所有包都已正确收到了

积累确认模式的缺点,乱序比较严重的网络下,效率非常低,部分已经送到但没有按照顺序送达的包也必须重传

改进方案,选择性重传,对于顺序的包,发送积累确认;对于跳跃的包,发送 ACK;发送端只重传真正丢失的数据包

3) 快速重传

使用 ACK 机制的传输协议,通常在发送端等到某个数据包的 ACK 超时后,才会重传数据包,不够及时。如果接收端接收到了序号跳跃的数据包,则立即给发送方发送最后一个连续的数据包的 ACK (重复确认),如果发送端收到连续 3 个重复确认,则认为该 ACK 的下一个数据包丢失了,并立即重传该丢失的数据包

4)NACK

接收方定时把所有未收到的包序号通过反馈报文通知到发送方进行重传

例如音视频数据包发送方按顺序发送了时间戳为60,120,180,240,320共五个包,接收者已经收到了60包,本来预期下一个接收的包的序号应该是序号120的包,但序号是120的包一直没收到,后面的包却收到了。那么接收者就可以判断,120这个包丢了,这时候接收方需要向发送方发出NACK消息(消息中带有丢包的序号,这里是120),让发送方重新发送丢失的包。

2 重传超时的计算规则

RTO (重传超时时间,Retransmission Timeout) 是发送端用来判断数据包丢失和执行重传的参数,该值应该是一个随网络传输的 RTT (往返时延) 而变化的值,理想情况下,RTO 的值>= RTT ,实际情况下,RTT 变化非常频繁,每一次传输的 RTT 可能都不一样。

TCP 协议采用的 RTO 重传超时时间计算方法:

基于多次 RTT 测量,给出一个平滑后的 RTT 预估值,即 SRTT (Smoothed Round Trip Time)

RTO = SRTT + 某种系数 (防止抖动的阈值)

系统级别设置 RTO 的下限为 100ms 或 200ms,防止异常值

对于重传包的 RTO,加上退避算法,比如,每重传一次,则 RTO = 2 * RTO 以减少对一个包频繁的

发送缓冲区

接收缓冲区

3 粘包问题

保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。UDP协议有消息边界,不存在粘包问题。

而TCP面向流则是指无保护消息保护边界的,存在粘包问题:

1 )发送端引起的粘包

发送端需要等缓冲区满才发送出去,造成粘包

nagle算法就是为解决网络中小包太多  合并大包来提升网络传输效率的算法

开启 TCP_NODELAY,禁用nagle算法

nagle算法:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。

通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。

        如果开启了这个算法 (默认),则协议栈会累积数据直到以下两个条件之一满足的时候才真正发送出 去:

  1. 积累的数据量到达最大的 TCP Segment Size    == 即MSS
  2. 收到了一个 Ack

TCP-MSS(TCP Maximum Segment Size,TCP最大报文段长度)是指TCP连接的对端发往本端的最大TCP报文段的长度。当一个连接建立时,连接的双方都要通告各自的MSS(因此MSS选项只能出现在SYN报文段中)。对于IPv4,为了避免IP分片,主机一般默认MSS为536字节 (576IP最大字节数-20字节TCP协议头-20字节IP协议头=536字节)。同理,IPv6的主机默认MSS为1220字节(1280IP最大字节数-20字节TCP协议头-40字节IP协议头=1220字节)

延伸概念MTU:

MTU(Maximum Transmission Unit,最大传输单元)是指链路层的最大传输单元,包括TCP头和IP头,不包括链路层封装头。

TCP Delayed Acknoledgement 类似,它的作用就 是延迟 Ack 包的发送,使得协议栈有机会合并多个 Ack,提高网络性能。 Delayed Ack 默认超时时间 40ms,

现代的 TCP/IP 协议栈实现,默认几乎都启用了nagle和TCP delayed ack这两个功能

2 )接收方引起的粘包

接收方不及时接收缓冲区的包,造成多个包接收

3 )解决方案

设计好数据包格式,包头,包尾分隔符,包类型,包大小,校验信息;

接收端开启预处理线程拆包

4 wireshark实测tcp协议

 结合上图我们使用最多的DIX Ethernet V2以太帧格式(另一种是IEEE的802.3标准),tcpdump抓包样例如下:

wireshark查看该tcpdump数据包,共分为4层,从上到下依次物理层(以太网mac帧),数据链路层(mac地址) ,网络层(ip地址),TCP传输层(端口)和TLS传输层(加密)

物理以太帧参数意义:

Frame 33: 393 bytes on wire (3144 bits), 393 bytes captured (3144 bits)33号帧,实际捕获393字节

Arrival Time: Mar  3, 2023 18:00:33.119845000 CST 捕获日期和时间
[Time delta from previous captured frame: 0.076516000 seconds] 此包与前一包时间间隔
[Time since reference or first frame: 1.276950000 seconds]       此包与第一个帧的时间间隔
Frame Number: 33 帧序号
Frame Length: 393 bytes (3144 bits) 帧长度
Capture Length: 393 bytes (3144 bits) 捕获帧长度
[Frame is marked: False] 此帧是否做了标记:否
[Protocols in frame: eth:ethertype:ip:tcp:ftp] 帧内封装的协议层次结构
[Coloring Rule Name: TCP] 用不同颜色的染色标记的协议名称:TCP
[Coloring Rule String: tcp] 染色显示规则字符串

tcp传输层参数意义:

SYN表示建立连接

ACK表示响应

PSH表示接收端收到数据后,是否立即传给上层

RST表示连接重置

FIN表示关闭连接

 ack序号=当次对端seq序号+len

seq序号=上次本端seq序号+len

http应用层参数意义:

range:下载范围

connection:close   短连接,keep alive长连接

延伸http1.0和http1.1的区别:

a http1.0只支持短连接,http1.1可支持长连接

b http1.1新增host字段,支持虚拟主机。同一个物理主机上可能对应多个虚拟ip,分别对应不同的网站,通过host字段可以区分不同的网站

c 请求方法

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

以下是wireshark添加的标记,并非TCP报文内容

发送端触发
[TCP window Full]作为发送方的标识,当前发送包的大小已经超过了接收端窗口大小,wireshark会打上此标识,标识不能在发送。

[TCP Fast Retransmission]快速重传,一般快速重传算法在收到三次冗余的Ack,即三次[TCP dup ack XXX#X]后,发送端进行快速重传。 

接收端触发

[TCP window update] 当接收端接收窗口大小发生变化,可以接收数据了,则有该标志。

[TCP ZeroWindow]作为接收方发出现的标志,表示接收缓冲区已经满了,此时发送方不能再发送数据,一般会做流控调整。接收窗口,也就是接收缓冲区win=xxx ,告诉对方接收窗口大小。

[TCP dup ack XXX#X]表示第几次重新请求某一个包,#前XXX表示第几个包(不是Seq),#后的X表示第几次请求。丢包或者乱序的情况下,会出现该标志。

[TCP Retransmission]超时重传,如果一个包的丢了,又没有后续包可以在接收方触发[Dup Ack],或者[Dup Ack]也丢失的情况下,TCP会触发超时重传机制。

[TCP Previous segment not captured],丢包。

[TCP Out-Of-Order]指的是TCP发送端传输过程中报文乱序


 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值