传输控制协议TCP

article/2025/10/11 2:56:19

一、概述

  1. 概念:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
  2. TCP最主要的特点
    (1)TCP是面向连接的运输层协议。
    (2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。(ps.端点即socket套接字,socket = (IP : 端口号) )
    (3)TCP提供的服务是可靠的。
    (4)TCP提供的是全双工的通信。
    (5)面向字节流。

   TCP发送消息所采用的方式与UDP完全不同,它是面向字节流的传输协议,根据通信的对方给出的窗口值和网络拥塞的情况来决定发送的数据数量。

二、TCP报文的首部格式

   TCP虽然是面向字节流的协议,但它的数据单元是报文段,TCP报文段由头部和数据组成,其中头部包含着传输所需要的所有功能。

   TCP首部的前20个字节是固定的,后面的根据需要再添加:
在这里插入图片描述

  1. 源端口与目的端口:写入发送方和接收方的端口号,各占2个字节。
  2. 序号:标明这次传输的报文段从第几个字节开始,占4个字节。
  3. 确认号:期望收到对方下一个报文段的起始字节序号,占4个字节。
  4. 数据偏移:指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。占4个字节。(ps.就是说数据在报文段的第几个字节才开始。)
  5. 保留:保留着以后用。目前置为0。

    以下的六个字段都是标志位,只有0和1的值。

  1. URG:如果报文段中包含着紧急数据,该字段置为1,即告诉系统应尽快传送此报文段(该报文段可以插队)。如果URG=1,应结合紧急指针给出的紧急数据的位置,把它插入到本报文段的最前面。
  2. ACK:如果ACK=1,确认号才有效,为0时确认号是无效的。(ps.TCP规定,在连接建立后所有传送的报文段都必须置ACK为1
  3. PSH:如果发送方希望在发送完此报文段之后立即收到接收方的响应报文,就置PSH=1,接收方收到后就不会等到缓存满了之后再发送,而是直接发送现有数据。
  4. RST:如果RST=1,代表需要重新建立连接,即先释放当前连接,再建立连接。(ps.TCP连接中出现了严重差错,或者拒绝非法的报文,拒绝打开连接。
  5. SYN:如果这是一个请求连接或者接受连接的报文,SYN应置为1。
  6. FIN:如果要释放一个连接,FIN应置为1。
  7. 窗口:给出接收方回应报文应控制在多大范围里。即窗口值就是现在的发送方的接收缓存能容纳的字节数。占2字节。
  8. 检验和:在发送端将发送的字节转成16位的二进制,求出各个字节的二进制之和。注意,如果加的时候出现了最高位的溢出,要进行回卷(即将溢出的高位数与剩下的低位数相加),再将得到的数字进行反码运算,即得到了检验和。随后在接收端将收到的数据和检验和相加,如果和全为1,代表没有出错;否则(有一位为0),在传输时发生了错误。占2字节。
  9. 紧急指针:只在URG=1时才有意义,它标明了紧急数据末尾在报文段中的位置。占2字节。
  10. 选项:选填的,最多占40字节。

三、TCP如何建立连接

1.三次握手

TCP建立连接的过程又被叫做三次握手,如图所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200305213515913.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzM2ODIy,size_16,color_FFFFFF,t_70)

在最开始时,A和B都处于CLOSED状态。

第一次握手:A握手:A发送请求B的报文到服务器,其中:
SYN=1请求连接seq=x从第x个字节发送数据
因A的请求连接B会进入LISTEN状态;而A发送请求报文之后会进入SYN_SEND状态,等待B的确认。

第二次握手:B握手:B收到请求报文,确认SYN=1。然后发送一个响应报文,其中:
SYN=1同意连接ACK=1ack有效seq=y从第y个字节开始发送ack=x+1期望A发送第x+1个字节开始的数据
此时B进入SYN_RECV状态。

第三次握手:A握手:A收到B的响应报文,向B发送再次确认报文,其中:
ACK=1ack有效seq=x+1从第x+1个字节开始发送ack=y+1期望B发送第y+1个字节开始的数据
发送完毕后A和B都进入ESTABLISHED状态,此时A和B已建立好连接。

2.第三次的握手的必要性

    假如A发送的请求消息滞留了,重传机制会重新发送消息给B,B接收并发送给A确认信息,如果这时A没有了再次确认的动作,即第三次握手的动作,那么这次连接就会建立成功。可是之前滞留的那条消息出来了,按目标端口号依然发送给了B,不知情的B再次发送给A一个确认的信息,这就导致了一个错误的连接。
   所以第三次的握手动作,可以验证当前是否真的需要通信,不需要就不会进行第三次的握手。

四、TCP如何释放连接

1.四次挥手

TCP释放连接的过程又被叫做四次挥手,如图所示:
在这里插入图片描述
在数据都发送完毕后,TCP需要释放连接。在释放开始前,双方都处于ESTABLISHED连接状态。

第一次挥手:A挥手释放:A发送请求释放连接的报文,其中:
FIN=1释放连接seq=u*从第u个字节开始
此时A进入FIN-WAIT-1状态,等待B的确认。

第二次挥手:B挥手确认:B发送确认A释放连接的报文,其中:
ACK=1ack有效seq=v从第v个字节开始ack=u+1期望第u+1个字节开始
此时B被通知到了A的释放请求,B被动关闭,进入CLOSE-WAIT状态。

(而收到此条确认报文的A会进入FIN-WAIT-2状态。)

第三次挥手:B挥手释放:B也确认释放连接,发送报文给A,其中:
FIN=1释放连接ACK=1ack有效seq=w从第u个字节开始ack=u+1期望第u+1个字节开始
此时B进入LAST-ACK状态,等待A的最后确认。

   注意:如果B没有进行第三次的挥手,即B自己并不想释放连接,A就会进入半关闭的状态。

第四次挥手:A挥手确认:收到B释放的报文,A进入TIME-WAIT状态。A发送确认B释放的报文,其中:
ACK=1ack有效seq=u+1从第u+1个字节开始ack=w+1期望第w+1个字节开始

   注意
(1)如果B没有收到最后一次的A的ACK确认信息,就会引发重传机制,B会重新发送FIN。
从而保证了A发送的ACK确认信息一定会到达B。
(2)保证本次连接所产生的所有报文段都可以在2MSL中从网络中消失。

2.为什么断开连接是四次挥手

因为TCP是全双工的,所以双方都要发送请求释放的信息,对方进行确认,所以是四次。

3.为什么在断开连接之后还要等待2MSL时间

(1)为了保证A发送的最后一个确认报文能够到达B:如果B没有收到最后一次的A的ACK确认信息,就会引发重传机制,B会重新发送FIN+ACK,而A就能在2MSL时间内收到这个重传的报文段。如果A在接收到B的释放报文段后就立即进入CLOSED关闭状态,就不会接收到B的重传报文,B也就会因收不到A的确认报文而一直无法正常关闭。

(2)保证本次连接所产生的所有报文段都可以在2MSL中从网络中消失,不会让下一个新的连接中出现旧的连接请求报文段。

五、TCP的可靠性

   tcp通过以下7点保证可靠性:

1.检验和

   检验和用来避免将消息发送给错误的接收方。TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部

发送端
   首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。把TCP报头中的校验和字段置为0。
   其次,用反码相加法(对每16bit进行二进制反码求和)累加所有的16位字(进位也要累加,进位则将高位叠加到低位)。
   最后,将上述结果作为TCP的校验和,存在检验和字段中。

接收端
   将所有原码相加,高位叠加到低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。

   注意:检验和可以避免将消息发送给错误的接收方,但是不能把发错的消息重新收回再发送给正确的接收方。对于接收方来说依然是没有收到消息。

2.序列号

   tcp将每个字节的数据都进行了编号,也就是序列号

   序列号的作用
       a.保证可靠性(接收到的数据少了某个序号的数据时,马上能知道)
       b.保证数据的按序到达
       c.提高效率,可实现多次发送,一次确认列号来实现。(ack,seq)

3.确认应答机制(ACK)

    当ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据,而如果等待了一定的时间还没有收到确认报文就会启动重传机制

4.重传机制

(1)超时重传机制:当每发送一个数据段时就会启动一个重传计时器,如果在计时器到时之后依然未收到ack确认,那么会立即重传这个数据。
(2)快重传:超时重传机制效率低,所以发展出快重传机制。 他与超时重传机制并存(计时器先到时就用超时重传,先确认重传M3就用快重传,他们是同时存在的。)当快重传算法开始施行以后就不需要等到收到上一次数据的确认数据就可以发送。 没有按序收到的m4,m5这些也会保存在接收方但是不会引起滑动窗口右移,而是直到数据全部有序之后窗口才右移。

5.连接管理机制

   即tcp建立连接时的三次握手和释放连接时的四次挥手。

6.拥塞控制

如【拥塞控制】笔记所述。(写完贴上)

7.流量控制

通过滑动窗口进行,见[TCP滑动窗口协议](https://blog.csdn.net/qq_43336822/article/details/104705380)。(写完贴上)

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

相关文章

[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…

ISCC2022 擂台misc

文章目录 666扫!弱雪真扫黑暗森林PNGstego这是压缩包吗?小 数 学习了 P.S:抬杠就是你对 666 考查知识点:伪加密、猜谜的steghide弱口令爆破、流量分析、gif帧、键盘密码、AES 下载下来是一个压缩包,但是图片显示需要密码&#xf…