传输控制协议(TCP)

article/2025/10/11 21:49:45

可靠的流传输服务

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

五个可靠交付特征

1.面向流
2.虚电路连接。如同打电话一样,在传输之前,协议软件模块的下层的互联网发送报文来进行通信,合适传送是否经过认可,双方是否做好准备。在细节处理妥当时,就可以传输开始了。
3.带缓冲的传送。为了尽可能减少网络通信量,协议软件实现时通常会收集足够多的数据明知道填满一个数据报,然后再传输到互联网上。如果每次只产生1八位组的流,效率也很高。如果产生特别大的程序块,协议软件会划分成小片进行传输。有些应用程序还没有等到数据装满一个缓冲区就必须交付数据,流服务提供了一种“”的机制。在发送端,强迫协议软件传送当前生成的 数据,不必等到装满缓冲区。当数据到达接收端时,会强迫吧数据给应用程序使用。
4.无结构的流。不会照顾到结构化的数据流。
5.全双工连接。全双工连接包括了两个相反流向的独立的流,两流没有明显的交互。

滑动窗口

设计动机:为了获得可靠性,发送一个分组后,需要等待确认才能传输另一个分组。如果机器延迟响应时间,会大量的浪费网络带宽。
设计思路:允许发送方在等待确认时,发送多个分组。
从技术上讲,在任意一个时刻,未被确认的分组收到窗口大小的限制。例如,在一个窗口大小为8的滑动窗口协议中,发送方在收到确认之前允许传送8个分组。
当发送方收的到了对窗口内第一个分组的确认信息时,他可以向后滑动一格,并发送下一个分组。随着确认的不断到达,窗口也在不断向后移动。
需要注意的时,TCP允许窗口大小随时间而改变,这不仅提供可靠传输,还提供了流量控制。

TCP报文格式

源端口(SOURCE PORT)和目的端口(DESTINATION PORT):包含TCP端口号,用于标志位于两端的应用程序。
序号(SEQUENCE NUMBER):之处报文段的数据在发送方的字节流的位置。
确认序号(ACKNOWLEDGEMENT NUMBER):指明源站希望收到的下一个八位组的编号。
选项(HLEN):指明首部长度
保留(RESERVED):
代码比特(CODE BIT):表示报文段的目的和内容。
窗口(WINDOW):指明可用缓冲区的大小,通告自己愿意接受多少数据。
在这里插入图片描述

TCP连接的建立与关闭

在这里插入图片描述
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

通俗理解三次握手:
客户端:你好,听的到我说话吗?
服务器:我能听到,你可以开始说了
客户端:好的,那我们开始会话吧

在这里插入图片描述
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。

通俗理解四次挥手:
客户端:我要走了,你还有什么话要说吗?
服务器:你稍等一下,我还有几句
服务器:我说完了,可以再见了
客户端:好的,拜拜

拥塞控制

拥塞现象:一个或者多个交换点的数据超载而导致剧烈增加的现象。
拥塞崩溃:通常情况下,端点并不知道拥塞发生在那里,也不知道为什么发生拥塞。遗憾的是,大部分的运输协议使用重传和超时机制。重传置灰加剧拥塞,如果不加抑制,恶性循环通信量,直到网络不可在使用。

流量控制

如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。


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

相关文章

传输控制协议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…

ISCC理论题小解

B 域、工作组和家庭组表示在网络中组织计算机的不同方法。它们之间的主要区别是对网络中的计算机和其他资源的管理方式。 网络中运行 Windows 的计算机必须属于某个工作组或某个域。家庭网络中运行 Windows 的计算机也可以属于某个家庭组,但这不是必需的。 家庭网络…

ISCC web4

ISCC web4 打开网页看到: 代码审计。。。。。。。。。 一开始以为是sha256解密,结果半天搞不出来 后来才知道parse_url函数存在变量覆盖漏洞 因为要存在action参数,传入actionauth key也要传入key0 由于key是要被sha256加密的 传入一个has…