传输层-传输控制协议(TCP)

article/2025/10/11 15:23:29

目录

  • TCP 协议概述
  • TCP 报文段结构
  • TCP连接管理
    • 三次握手
    • 四次挥手
  • TCP 可靠数据传输
  • TCP拥塞控制

TCP 协议概述

传输控制协议(TCP)是Internet传输层协议。提供面向连接、可靠、有序、字节流传输服务。

  • 面向连接:应用程序在使用 TCP 之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。
  • 可靠:通过 TCP 连接传送数据,可以确保无差错、不丢失、不重复、并且按序到达。
  • 字节流:“流”指的是流入到进程或从进程流出的字节序列。应用程序和TCP的交互是一次一个数据块,TCP把应用程序交付的数据看成是一连串的无结构的字节流。
  • TCP提供全双工通信服务:TCP允许通信双方的应用进程在任何时候都能发送数据和接收数据。

TCP 为没快客户数据配上一个 TCP 首部,从而形成多个 TCP 报文段。这些报文段被交付给网络层,网络层将其分别封装在网络层IP数据报中。然后这些 IP 数据报被发送到网络中,最终送达目的主机。

TCP 报文段结构

shuyu
  • 源端口号 与 目的端口号:字段分别占 16 位,表示发送该报文段的源端口号和目的端口号,用于多路复用/分解来自或送到上层应用的数据。
  • 序号:TCP 的序号是对每个应用层数据的每个字节进行编号。
  • 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。
  • 首部长度:占 4 位,指出 TCP 段的首部长度,以 4 字节为计算单位。最短是 20 字节;最长是 60 字节。
  • 保留:占 6 位,保留为今后使用,目前值为 0。
  • URG 、ACK 、PSH 、RST 、SYN 、FIN:为标志位字段;各占 1 位,取值为 0 或 1;
    • 紧急 URG=1,紧急指针字段有效,优先传送。
    • 确认 ACK=1,确认序号字段有效; ACK=0 时,确认序号字段无效。
    • 推送 PSH=1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付。
    • 复位 RST=1,TCP 连接出现严重差错,释放连接,再重新建立 TCP 连接。
    • 同步 SYN=1,该 TCP 报文段是一个建立新连接请求控制段或者同意建立新连接的确认段。
    • 终止 FIN=1,TCP 报文段的发送端数据已经发送完毕,请求释放连接。
  • 接收窗:段占 16 位,向对方通告我方接收窗口的大小。
  • 校验和:占 16 位,校验和字段检验的范围类似于 UDP,计算方法与 UDP 校验和的计算方法相同。Í。
  • 紧急指针:占 16 位。URG=1 时,才有效。指出在本 TCP 报文段中紧急数据共有多少个字节。
  • 选项(长度可变):基本不用 。最短为 0 字节, 最长为 40 字节。 例如:发送方告诉接收方其缓存能够接收的数据段的最大长度是 MSS 个字节。 【最大报文段长度(Maximum Segment Size, MSS): 报文段中封装的应用层数据的最大长度。】
  • 填充:长度0~3字节,取值全为 0,目的是为了整个首部长度是 4 字节的整倍数。

TCP连接管理

三次握手

shuyu
  1. 第一次握手(请求连接):客户端座位连接建立发起端,选择客户端初始序列号 x,向服务器发送(SYN=1, seq=x)的 SYN 段。客户状态由 LISTEN 进入 SYN_SENT 状态,等待服务器确认。
  2. 第二次握手(请求连接,并响应请求连接):服务器收到客户发送的 SYN 段后,选择服务器初始序列号 y,向客户发送(SYN-1, ACK=1, seq=y, ack=y+1)的 SYNACK 段,同时,服务器状态由 LISTEN 进入 SYN_RCVD 状态。
  3. 第三次握手(确认接收响应,建立连接):客户端收到服务器的 SYNACK 段后, 向服务器发送(ACK=1, seq=x+1, ack_seq=y+1)的 ACK 段,同时,客户端进入 ESTABLISHED 状态,客户端确认连接已建立;当服务器收到 ACK 段后,也进入 ESTABLISHED 状态,也确认连接已建立。至此,双方均确认连接建立成功。

客户端状态:

  • 关闭状态 CLOSED,处于初始状态;
  • 同步已发送状态 SYN_SENT;
  • 已建立状态 ESTABLISHED,表示可以传送数据。

服务端状态:

  • 关闭状态 CLOSED,处于初始状态;
  • 监听状态 LISTEN;
  • 同步收到状态 SYN_RCVD ;
  • 已建立状态 ESTABLISHED,表示可以传送数据。

四次挥手

假设客户端首先请求断开 TCP 连接

shuyu

TCP 建立连接要进行三次握手,而断开连接要进行四次。这是由于 TCP 的半关闭造成的。因为TCP 连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闲就叫半关闭。当一方完成它的数据发送任务,就发送一个 FIN 来向另一方通告将要终止这个方向的连接。

  • 第一次挥手(请求释放):客户端发送一个 FIN=1 ,用来关闭客户端到服务器端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说"我客户端没有数据要发给你了,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。‘
  • 第二次挥手(响应请求):服务器端收到 FIN 后,先发送 ack=M+1 ,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务器端的 FIN 报文。
  • 第三次挥手(服务端完成,终止响应):当服务器端确定数据已发送完成,则向客户端发送FIN=1报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入 LAST_ACK 状态。
  • 第四次挥手(响应彻底释放):客户端收到 FIN=1 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送 ack=N+1 后进入 TIME_WAIT 状态,如果 Server端 没有收到 ACK 则可以重传。

服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端己正常关闭,那好,我容户端也可以关闭连接了。最终完成了四次握手。

客户端状态:

  • ESTABLISHED 状态,表示可以传送数据;
  • FIN_WAIT_1 终止等待 1 状态,等待服务器端的确认;
  • FIN_WAIT_2 终止等待 2 状态,等待服务器端发出的连接释放报文段;
  • TIME_WAIT 时间等待状态,表示等待 2 倍 MSL 时间后进入关闭状态 CLOSED;

服务端状态:

  • ESTABLISHED 状态,表示可以传送数据;
  • CLOSED_WAIT 关闭等待状态;
  • LAST_ACK 最后确认状态;
  • CLOSED 关闭状态。

TCP 可靠数据传输

一、TCP 能够提供可靠的数据传输服务,是通过一下工作机制来实现的:

  1. 应用数据被分割成 TCP 任务最合适发送的数据块(统称是MSS),封装成 TCP 端,传递给 IP。
  2. 当 TCP 发出一个段后,启动一个计时器,等待目的端确认收到这个报文段。如果不能及时接收到一个确认,则认为该报文段丢失,将重发这个报文段。当 TCP 收到发自 TCP 连接另一端的数据,将发送一个确认段。
  3. TCP 首部中设有校验和字段,用于检测数据在传输过程中是否发生差错。如果收到的报文段通过校验和检测,发现有差错, TCP 将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发),而将已连续收到的应用层数据的最后一个字节的序号加 1,作为确认序号,向发送方发送确认段。
  4. 由于 TCP 报文段封装到 IP 数据报中传输,而 IP 数据报的达到可能会经过不同的路径从而造成顺序错乱,因此 TCP 报文段的到达也可能会失序。如果必要,TCP 将根据序号对接收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  5. 由于存在网络延迟和重传机制,TCP 的接收端有可能会收到多个重复的报文段,这时接收端需要根据序号把重复的报文段丢弃。
  6. TCP 能够提供流量控制。TCP 连接的每一方都在建立连接时分配一定大小的接收缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这可以防止较快主机发送数据太快,致使较慢主机的缓冲区溢出。

TCP拥塞控制

拥塞控制:通过合理调度、规范、调整向网络中发送数据的主机数量、发送速率、数据量,以避免拥塞的发生。
TCP 拥塞控制的算法包括:慢启动;拥塞避免;快速重传;快速恢复。

  • 慢启动:阈值之前的阶段称之为慢启动阶段,每经过RTT,拥塞窗口大小加倍。
  • 拥塞避免:阈值之后的阶段称之为拥塞避免阶段,每经过RTT,拥塞窗口大小增加1。
  • 快速恢复算法:当发生 3 次重复确认时,不再从慢启动阶段开始, 而是直接从新的阈值开始,直接进拥塞避免阶段。
    • 新阈值(12) =当前窗口(24)的一半;
    • 新拥塞窗口=新阈值。
  • 计时器超时:可判定发生拥塞且拥塞严重。
    • 新阈值(12)=当前窗口(24)的一半;
    • 新拥塞窗口=1
    • 然后再从慢启动阶段、拥塞避免阶段增加窗口数量。
shuyu

http://chatgpt.dhexx.cn/article/ZfgADLGc.shtml

相关文章

传输控制协议---TCP协议【详解】

目录 一、协议简介 二、TCP报文格式 1、字段解析 2、报文解析 三、TCP的重传机制 1、超时重传 2、快速重传 3、 SACK 方法 4、Duplicate SACK 四、TCP的滑动窗口机制 五、流量控制 六、拥塞机制 1、慢启动 2、拥塞避免算法 3、拥塞发生 4、快速恢复 七、TCP的三…

传输控制协议(TCP)

可靠的流传输服务 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文介绍TCP把他当成TCP/IP网际协议族的一部分,是一个独立的通信协议。 五个可靠交付特征 1.面向流…

传输控制协议TCP

一、概述 概念:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP最主要的特点: (1)TCP是面向连接的运输层协议。 (2&a…

[2] SDL的基础知识以及利用SDL播放视频

此博文相关知识点从雷神的博客以及视频学习,截图也是用了他的课件, 雷神博客地址:http://blog.csdn.net/leixiaohua1020/ 日期:2016.10.1 作者:isshe github:github.com/isshe 邮箱:i.ssheoutlook.com …

Start Game:SDL2简介

Start Game:SDL2简介 官网简介: Simple DirectMedia Layer是一个跨平台开发库,旨在通过OpenGL和Direct3D提供对音频、键盘、鼠标、操纵杆和图形硬件的低级别访问。它被视频播放软件、模拟器和流行游戏使用,包括Valve的获奖目录和许…

SDL2的学习之路<三>显示文字

前言 上节介绍了怎么利用SDL接口去显示图片,这节主要介绍怎么去显示文本信息。 SDL2展示文字需要在官网下载SDL2_ttf的扩展库。这个第一节已经讲过了。 使用时需要先初始化库,使用结束时释放库资源。 TTF_Init(); //初始化库 … TTF_Quit(); //释放 显…

VS2019配置SDL2库

“SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS…

SDL系列教程(一):SDL简介

SDL教程(一) 作者:akinggw 在阔别半年后,我又回来了。这次回来,首先要向大家问声好,然后继续我们的游戏开发之旅。在以前的日子里,我主要在翻译一些游戏开发方面的文章,而现在&…

SDL2源代码分析1:初始化(SDL_Init())

SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL2源代码分析2:窗口(SDL_Window) SDL2源代码分析3:渲染器(SDL_Renderer) SDL2源代码…

SDL2入门教程(01_hello_SDL)

注: 本教程翻译自 lazyfoo的教程,原网址戳这里。翻译目的为鼓励自己坚持下去,可能语言不准确,仅供参考。 Hello SDL: 你的第一个图形窗口 这一篇教程包含最主要也最基础的一步——弹出一个窗口(Window) …

SDL2源代码分析2:窗口(SDL_Window)

SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL2源代码分析2:窗口(SDL_Window) SDL2源代码分析3:渲染器(SDL_Renderer) SDL2源代码…

SDL2使用简介

转自我的Gitee项目 SDL2使用简介 SDL2使用简介开发环境搭建WindowsVisual StudioCode::BlocksDev-Cpp CMake(CLion)问题总结 SDL2库使用介绍初始化创建窗口绘制矩形刷新屏幕读取输入直接扫描键盘读取系统事件 实例 绘制图片 SDL2使用简介 开发环境搭建 Windows Visual Stud…

SDL2 简明教程(二):创建一个空的窗口

系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 文章目录 系列文章目录创建空窗口总结 创建空窗口 在上一篇文章中,我们了解…

强大无比的嵌入式多媒体开发神器:SDL2

SDL 是什么? SDL(Simple DirectMedia Layer)是一套开源的跨平台多媒体开发库,使用 C 语言写成。 它提供了绘制图像、播放声音、获取键盘输入等相关的 API,大大降低多媒体应用开发难度的同时,也让开发者只要…

SDL2 简明教程(五):OpenGL 绘制

系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 SDL2 简明教程(三):显示图片 SDL2 简明教程&#xf…

SDL —— SDL2及API简介

SDL2框架 SDL( Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库, 使用 C 语 言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数, 让开发者只要用相同或是相似的 代码就可以开发出跨多个平台( L…

SDL2学习笔记(一):SDL2初步

一、Windows系统下的安装 MinGW ①安装MinGW并配置好环境变量; ②官网下载SDL for MinGW; ③将解压文件中的 .\i686-w64-mingw32\include\SDL2 复制到 .\MinGW\include ; //有的设备需要用x86_64-w64-mingw32中的文件,下同 ④将解…

ISCC2021—ISCC客服一号冲冲冲(二)

ISCC客服一号冲冲冲(二) 呦,又见面了,狗子 打开链接,发现登录接口似乎是个图片截了一块啊,把图片下载下来,lsp隐写发现源代码,同时php弱比较登录页面 (都看到这里啦&a…

ISCC2021——web部分

练武 ISCC客服冲冲冲(一) 该题目需要左边的客服票数高于右边的 我会的就两种方法,毕竟是废物嘛,允许 1、 把左右按钮换一下 然后就 2、在控制台输入 回车,走你 你涨啊,涨啊,接着涨啊…没吃…

ISCC,Misc:隐秘的信息

解码得到解压密码 解压出一张图,低位时头部显示有一串字符被 f f f f f 包裹,将可疑的字符单独拿出来 由于单个字符可能是由二进制错位导致的 fffffa4a9a1a1bd9 9b7a1a9ba34b127a 0b8abbc20b7a2b7a 2b524b43e9f8007f fffc7e3fe00fff00 71fffffffffffff…