网络篇08 | 运输层 tcp

网络篇08 | 运输层 tcp

01 简介

1)运输层的作用

运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。

2)与应用层的关系

bash 复制代码
http=TCP+80   (简单地说就是给TCP加一个端口一个名称)
   https=TCP+443
   ftp=TCP+21
   STMP=TCP+25
   PoP=TCP+110
   RDP=TCP+3389
   共享文件夹=TCP+445
   SQL=TCP+1433
   DNS=UDP+53   (极少数情况下使用TCP+53)

3)两个协议的应用场景

TCP(传输控制协议)---需要分段,编号,需要建立会话,有流量控制,可靠传输

UDP(用户数据报协议)---一个数据包就能完成数据通信,不用建立会话(不可靠传输)

4)传输的数据单位

两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元

TCP 传送的数据单位协议是 TCP 报文段 (segment)。

UDP 传送的数据单位协议是 UDP 报文或用户数据报。

02 功能特性

1)面向连接

TCP 包括连接建立、数据传输和连接终止三个阶段,并提供可靠的连接管理机制,确保数据的正确传输。TCP 是面向连接的运输层协议,要先建立会话。每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一),提供全双工通信同时收发。

2)停止等待协议

TCP中采用了停止等待协议的思想。发送方发送数据后等待接收方的确认(ACK),一旦接收到确认,发送方才会发送下一个数据包。如果发送方未收到确认,将认为数据包丢失或损坏,会进行重传。这种机制确保了数据的可靠传输。

每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

  • 无差错的情况:

    • A 发送完分组 M1 后就暂停发送,等待 B 的确认 (ACK)。
    • B 收到 M1 向 A 发送 ACK。
    • A 在收到了对 M1 的确认后,就再发送下一个分组 M2。
  • 出现差错的情况:

    • B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
    • M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。

在这两种情况下,B 都不会发送任何信息,那A 如何知道 B 是否正确收到了 M1 呢?

  • 解决方法:超时重传

    A 为每一个已发送的分组设置一个超时计时器,A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。若 A 在超时计时器规定时间内没有收到 B 的确认,就认为分组错误或丢失,就重发该分组。

  • 确认丢失和确认迟到

    确认丢失----若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内将不会收到确认,因此 A 在超时计时器到期后重传 M1。

假定 B 正确收到了 A 重传的分组 M1。这时 B 应采取两个行动:

(1) 丢弃这个重复的分组 M1,不向上层交付。

(2) 向 A 发送确认。确认迟到---B 对分组 M1 的确认迟到了,因此 A 在超时计时器到期后重传 M1。

  • B 会收到重复的 M1,丢弃重复的 M1,并重传确认分组。
  • A 会收到重复的确认,对重复的确认的处理:丢弃

停止等待协议的优点是简单,但缺点是信道利用率太低。

3)流水线传输协议

TCP还包括流水线传输协议的特性,允许发送方在等待确认的同时继续发送数据。TCP通过滑动窗口机制,发送方可以维护一个发送窗口范围内的多个数据包,而不需要等待所有数据包都被确认才发送下一个数据包。这样可以提高数据传输效率。

提高信道利用率的方法就是提高分组发送时间Td,即流水线传输,发送方连续发出多个分组,比如连续 ARQ 协议和滑动窗口协议。

由于信道上一直有数据不间断地传送,流水线传输可获得很高的信道利用率。

连续 ARQ 协议和滑动窗口协议采用流水线传输方式。

  • 连续 ARQ 协议
    • 发送窗口:发送方维持一个发送窗口,位于发送窗口内的分组都可被连续发送出去,而不需要等待对方的确认。
    • 发送窗口滑动:发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
    • 累积确认:接收方对按序到达的最后一个分组发送确认,表示:到这个分组为止的所有分组都已正确收到了。

累计确认的优点:容易实现,即使确认丢失也不必重传

  • 缺点:
    • 不能向发送方反映出接收方已经正确收到的所有分组的信息
    • 采用 Go-back-N(回退N),表示需要再退回来重传已发送过的 N 个分组。
    • 当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。

4)滑动窗口机制

TCP 默认使用滑动窗口机制来进行流量控制和拥塞控制。滑动窗口机制允许发送方根据接收方的反馈来动态调整发送数据的数量,以确保网络传输的高效性并避免过载。

  • 流量控制

    • 针对单个连接数据处理能力的控制。

    • 发送缓冲区丢包:

      ifconfig eth0:

      流量控制队列,参数:txqueuelen=1000、dropped =0(大于0,有可能发生了流控丢包),更改队列长度:ifconfig eth0 txqueuelen=1500

    • 接收缓冲区丢包:

      cat /proc/net/netstat

  • 拥塞控制
    TCP 通过拥塞控制算法(如慢启动、拥塞避免、快重传、快恢复等)来避免网络拥塞,并在拥塞发生时降低发送速率,以维持网络的稳定性。

5)数据重传机制

发送方生成sequence,接收方收到哪些seq并生成ack机制,如果一段时间内没有等到ack,客户端就重发。

  • 降低重传几率:
    • 1)滑动窗口机制:发送缓冲区、接收缓冲区,就是缓解数据重传机制。
    • 2)tcp分段机制:

传输层:数据分段机制,MSS(maxximum seqment size)如果数据包大于mss则会拆成小于等于mss的包;

网络层:MTU(maximum transmit unit)会继续分包,mss等于mtu减去40byte

max头部、ip头部(20Byte)、tcp头部(20Byte)、数据-MSS(1460Byte)、FCS

6)乱序重排机制

数据包到达接收缓冲区的顺序不一致,依靠数据包的sequence,接收方就能知道数据包的先后顺序,内核中有一个乱序队列;

TCP 使用乱序重排机制来正确地对接收到的乱序数据包进行排序,以确保数据包在传输上层应用程序之前按正确的顺序被组装。这种机制通过使用序列号字段(Sequence Number)来重新排序乱序的数据包,以恢复原始数据流的顺序性。

乱序重排机制在 TCP 的接收端实现,它负责管理接收缓冲区,将接收到的乱序数据包按照其序列号正确排序后再传递给应用层。

03 报文发送与接收

1)TCP报文说明

最大报文段长度 MSS 是每个 TCP 报文段中的数据字段的最大长度,与接收窗口值没有关系。

物理层:

链路层:

网络层(IP层):IP 数据报 = IP首部 + TCP 报文段(不能超过MTU的1500字节,标准以太网定义)

运输层(TCP层):TCP 报文段 = TCP首部 + TCP数据

应用层:数据格式随便定(传输过程中为字节流),尽量不超过1460字节,在超过 MTU 大小时,IP 层会负责对数据包进行分片。IP 层根据目标网络的 MTU 大小将大的数据包分割成更小的片段,并在接收端重新组装这些片段。这样可以确保大数据包能够在网络中正确传输,尽管分片可能会带来额外的开销和延迟。

2)报文传输交互

套接字:socket = (IP地址 : 端口号) ,每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。TCP 连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)}

3)报文段的首部格式

TCP 虽然是面向字节流的,但传送的数据单元却是报文段。一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。

TCP固定首部(20字节)

  • 源端口 Source Port(2 字节)

    端口是运输层与应用层的服务接口。运输层的复用和分用功能通过端口实现。

  • 目的端口 Destination Port(2 字节)

    端口是运输层与应用层的服务接口。运输层的复用和分用功能通过端口实现。

  • 序号 Stream index(4 字节)

    TCP 连接中传送的数据流中的每一个字节都有一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

(如发送的数据为1234,则序号为1;发送的数据为567,则序号为5;发送的数据为89,则序号为8;而不是1,2,3依次计数)

  • 确认号Acknowledgment Number(4 字节)
    是期望收到对方的下一个报文段的数据的第一个字节的序号。

【若确认号 = N,则表明:到序号 N -- 1 为止的所有数据都已正确收到。即若确认号为5,则5之前的1234数据已经收到】

  • 数据偏移(4 比特,即首部长度)
    指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。单位是 32 位字(以 4 字节为计算单位)。

【首部之后是数据部分,但首部的长度不固定,可能会由于选项长度的变化而变化,数据偏移量的变化就是由于这个】

  • 保留(6 比特)

    占 6 位,保留为今后使用,但目前应置为 0。

  • 紧急 URG(1 比特)

    控制位。当 URG = 1 时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)。

  • 确认 ACK(1 比特)

    控制位。只有当 ACK =1 时,确认号字段才有效。当 ACK =0 时,确认号无效。

  • 推送 PSH (1 比特)

    PuSH控制位。接收 TCP 收到 PSH = 1 的报文段后,就尽快(即"推送"向前)交付接收应用进程,而不再等到整个缓存都填满后再交付。

  • 复位 RST (1 比特)

    ReSeT控制位。当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

  • 同步 SYN (1 比特)

    SYNchronization控制位。

    • 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
    • 当 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段。
    • 当 SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。
  • 终止 FIN (1 比特)

    Finish控制位。用来释放一个连接。

    FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

  • 窗口(2 字节)

    窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。【窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化】

  • 检验和(2 字节)

    检验和字段检验的范围包括首部和数据这两部分。

    在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

  • 紧急指针(2 字节)

    在 URG = 1时,指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),指出了紧急数据的末尾在报文段中的位置。

TCP可变首部(最长可达 40 字节)

  • 选项(长度可变)
    MSS(Maximum Segment Size)是 TCP 报文段中一个用来指示最大有效载荷大小的字段。MSS 表示在 TCP 报文段中可以容纳的最大数据量(不包括 TCP 头部的大小),以字节为单位。
    MSS 的值通常受到网络环境和网络设备的限制,一般为 MTU(最大传输单元)减去 IP 头部和 TCP 头部的长度。因为在互联网中数据包需要通过网络传输,而每个网络链路可能有不同的 MTU,因此 TCP 报文段的大小应该适应网络链路的 MTU。

【最大报文段长度 MSS,不能太大,也不能太小,应尽可能大(默认值= 536 字节)】

  • 填充
    使整个 TCP 首部长度是 4 字节的整数倍。

TCP数据部分

TCP 数据部分是 TCP 报文段中的有效载荷数据,也就是传输的实际数据内容。在 TCP 中,应用层的数据被分割成更小的数据块,并封装在 TCP 报文段的数据部分中进行传输。

TCP 是一种面向连接的协议,它通过将应用层数据转换为数据包(TCP 报文段)来实现可靠的端到端通信。这些数据包包括 TCP 头部(包含控制信息如源端口、目标端口等)和数据部分,其中数据部分则包含了应用层产生的字节流数据。

应用程序向 TCP 传递字节流数据,TCP 将其分割成合适大小的数据块并添加所需的控制信息,然后通过网络传输到接收端。在接收端,TCP 会将接收到的数据包重新组装成原始的字节流数据,以便应用程序处理。

因此,TCP 数据部分中确实包含了应用层的字节流数据,这些数据经过 TCP 的封装和传输,最终被交付给接收端的应用程序进行处理。

02 抓包分析

1)3次握手

2)读写消息

  • 第1行,客户端给服务器发送数据,[PSH, ACK]。
    Seq=1代表以前从未传输数据,此次是从第1位开始发送数据给服务端。
    Ack=1表示客户端期望服务端返回Seq=1的数据包。
    Win=8192表达数据窗口大小。
    Len=3代表发送数据段的大小为3,数据内容是"111"。
  • 第2行,服务器给客户端回复数据,[ACK]
    Seq=1正是客户端所期望的Ack=1,
    Len=0,说明服务端并没有给客户端发送任何数据。
    Ack=4,服务端期待客户端继续发送第4个字节的数据,说明服务端已经接收到从客户端传递过来的"111"这3个字节的数据。

3)4次挥手

4次"挥手"的过程如下。

1)客户端到服务端:我关了。

2)服务端到客户端:好的,收到。

3)服务端到客户端:我也关了。

4)客户端到服务端:好的,收到。

相关推荐
J不A秃V头A13 分钟前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
starstarzz14 分钟前
计算机网络实验四:Cisco交换机配置VLAN
网络·计算机网络·智能路由器·vlan·虚拟局域网
DARLING Zero two♡16 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
小池先生27 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb30 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng33 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随41 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg1 小时前
gitlab代码推送
java
hanbarger1 小时前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python