TCP协议和TCP连接

news2025/7/27 21:17:51

TCP协议和TCP连接

  • 一、TCP协议的简介
  • 二、TCP连接的简介
    • 1、TCP连接的建立(TCP三次握手)
    • 2、TCP连接的断开(TCP四次挥手)

一、TCP协议的简介


TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接之后才能传输数据。TCP提供超时重发、丢弃重复数据、流量控制等功能,保证数据能从一端传输到另一端。

IP数据报(IP数据包)由首部和数据两部分组成。

IP数据报的数据部分封装了一个TCP报文段。
在这里插入图片描述

TCP报文段分为首部和数据两部分。
在这里插入图片描述

  • TCP首部:

TCP首部由 20字节的固定长度 和 可变长字段(选项和填充)组成,因此TCP首部的最小长度是20字节。

(1)源端口和目标端口

源端口:写入源端口号,用来标识发送该TCP报文段的应用进程。

目标端口:写入目的端口号,用来标识接收该TCP报文段的应用进程。

表示数据是从源端口通过什么协议发送出来的,目的对端需要通过什么协议来进行处理。

例如:

http端口 80 --tcp的80端口;

https端口 443 --包裹了一层SSL协议进行加密 --tcp的443端口;

ssh端口 22;

(2)序号和确认号(确保可靠性传输)

序号seq:每个数据包都对应着一个序列号。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。该字段表示本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号是101,共有100字节的数据。这就表明:本报文段的数据的第一个字节的序号是 101,最后一个字节的序号是 200。显然,下一个报文段的数据序号应当从 201 开始,即下一个报文段的序号字段值应为201。

确认号ack:每发送一个数据包都需要收到对应的确认包,确认号=序号+1。确认序列号包含发送确认的一端所期望收到的下一个序号。

(3)窗口(确保可靠性传输):滑动窗口,滑动窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。窗口大小就是指无需等待ACK可以继续发送数据的最大值。

报文中的win32代表接收窗口的大小,即表示这个包的发送方当前还有多少缓存区可以接收数据。

(4)SYN、FIN、RST、ACK、PSH、URG标志位

SYN: 发送/同步标志位(连接请求或者接受连接请求),用来建立连接,和ACK标志位搭配使用。连接开始时,SYN=1,ACK=0,代表连接开始但是未获得响应。当连接被响应的时候,标志位会发生变化,其中ACK会置为1,代表确认收到连接请求,此时的标志位变成了 SYN=1,ACK=1。

ACK:确认标记位,表示当前报文是一个确认包。(当标志位设置为1)

FIN:结束标志位,连接结束,断开链接,用于结束一个TCP会话。(当标志位设置为1)

RST:重置复位标志位,重置链接,用于复位对应的TCP连接。表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。(当标志位设置为1)

PSH:催促标志位,表示推送操作,就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理。一般发送情况下是等待缓冲区满后再交付。(当标志位设置为1)

URG:紧急标志位,将紧急数据排在普通数据的前面,用于保证TCP连接不被中断,并且督促中间层设备尽快处理。(当标志位设置为1)

Flags标识符:

[S] : SYN (开始连接)
[P] : PSH (推送数据)
[F] : FIN (结束连接)
[R] : RST (重置连接)
[.] : 没有Flag (表示除上面四种类型外的其他情况,有可能是ACK也有可能是URG)

(5)紧急指针:仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。

(6)检验和:用于验证TCP首部和TCP数据,强制字段,由发送端计算和存储,并由接收端进行验证。校验和错误的分组丢弃(因为源IP地址、源端口号或者协议字段可能被破坏)。

(7)数据偏移:表示数据开始的地方离TCP段的起始处有多远,实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。

(8)保留:为将来定义新的用途保留,当前置为0。

(9)选项和填充:

TCP规范中定义的选项是选项表结束、无操作、最大报文段长度、串口扩大因子、时间戳

最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。

选项用于提高 TCP 的传输性能,是可变长的可选信息,最多包含 40 字节。

选项长度不一定是32位的整数倍,所以要加填充位,以保证TCP头是32的整数倍。

  • TCP数据部分:

TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况,也会发送不带任何数据的报文段。

二、TCP连接的简介

1、TCP连接的建立(TCP三次握手)


三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器之间总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,同步连接双方的顺序号和确认号并交换TCP信息。
在这里插入图片描述

  • 第一次握手

    ​ 客户端发送 位码为SYN=1、随机产生seq=x的数据包 到服务器端,服务器端由数据包中的SYN=1知道客户端要求建立联机;

  • 第二次握手

    ​ 服务器端收到请求后要确认联机信息,向客户端发送 位码为SYN=1和ACK=1、随机产生seq=y、ack=(客户端请求连接时的seq)+1的数据包,代表接收到连接请求并且向客户端再次确认;

  • 第三次握手

    ​ 客户端收到后检查ack是否正确,即第一次发送的seq+1,以及位码ACK是否为1,代表收到了服务器端发过来的确认信息。之后客户端Client会再向服务器发送 位码为ACK=1、seq=x+1、ack=(服务器端的seq+1)的数据包,服务器Server收到后确认ack值与ACK=1,连接建立成功。

例如:

第一次握手 - 客户端发送的数据包:seq=811714921、SYN=1

第二次握手 - 服务器端发送的数据包:seq=4262823974、ack=811714922、SYN=1、ACK=1

第三次握手 - 客户端发送的数据包:seq=811714922、ack=4262823975、ACK=1

2、TCP连接的断开(TCP四次挥手)


四次挥手(Four-Way Wavehand),即终止TCP连接,是指断开一个TCP连接时,需要客户端和服务端之间总共发送4个包以确认连接的断开。

在这里插入图片描述

客户端和服务器端都处于ESTABLISHED(连接状态)。

  • 第一次挥手

1.客户端的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。释放报文段首部的终止位FIN=1、序号seq=m(m等于前面已传送过的数据的最后一个字节的序号加1)。这时,客户端进程进入FIN-WAIT-1(终止等待1)状态,等待服务器端的确认。

注:TCP规定FIN=1的报文段即使不携带数据,也会消耗掉一个序号。

  • 第二次挥手

2.服务器端收到连接释放报文后,立即发出确认报文,确认号ack=m+1、序号seq=n(n等于服务器进程前面已传送过的数据的最后一个字节的序号加1)。这时,服务器进程进入CLOSE-WAIT(关闭等待)状态。

注:TCP服务进程这时应通知高层应用进程,从客户端到服务器端这个方向的连接释放了,这时的TCP连接处于半关闭状态,即客户端已经没有数据要发送了,但服务器端若发送数据,客户端仍要接收。也就是说,从服务器端到客户端这个方向的连接并未关闭,这个状态可能会持续一段时间。

3.客户端收到来自服务器端的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待服务器端发出的连接释放报文段(在这之前还需要接受服务器Server发送的最后的数据)。

  • 第三次挥手

4.若服务器端已经没有要向客户端发送的数据,其应用进程就通知TCP释放连接。服务器端发出的连接释放报文段终止位FIN=1,假定序号为p(在半关闭状态服务器端可能又发送了一些数据),重复上次发送数据包的确认号ack=m+1。这时,服务器进程进入LAST-ACK(最后确认)状态,等待客户端的确认。

  • 第四次挥手

5.客户端收到服务器端的连接释放报文段后,对此发出确认。确认报文段中确认位ACK=1、确认号ack=p+1、序号seq=m+1。然后客户端进入TIME-WAIT(时间等待)状态,必须经过时间等待计时器设置的时间2MSL后,客户进程才进入CLOSED状态,当撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

注:时间MSL(Maximum Segment Lifetime)叫做最长报文段寿命。规定是MSL为2分钟,2MSL就是4分钟,但是实际中30秒、1分钟、2分钟都在使用。

6.服务器端只要受到了客户端的确认后,就进入CLOSED状态。在服务器端撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

注:服务器端结束TCP连接的时间要比客户端早一些。

例子:

第一次挥手 - 客户端发送的数据包:seq=4262827060、ack=811717408、FIN=1、ACK=1

第二次挥手 - 服务器端发送的数据包:seq=811717408、ack=4262827061、ACK=1

第三次挥手 - 服务器端发送的数据包:seq=811717408、ack=4262827061、FIN=1、ACK=1

第四次挥手 - 客户端发送的数据包:seq=4262827061、ack=811717409、ACK=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“御黑行动”进行中,三月重保单位已开放接入!

三月重保在即,对于诸多政企单位来说,正面临着特殊时期的安全保障工作这一重要“大考”。 面对越来越专业且隐匿的攻击,各单位承受着巨大压力,尤其是政府、国企、央企等具有重要地位及广泛社会影响面的单位,其网站及业务…

opencv图像的算术运算

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

chatgpt如何解决模型训练过程中一些未知错误:以xgboot devices_.IsEmpty为例

本文尝试用现在最火的chatGPT在工作中提高生产力。具体背景如下:在训练模型过程中,为了避免资源抢占,我指定了其他的gpu来提高模型训练效率,但是发现训练的时候模型正常,但是在模型预测的时候一直报错,尝试…

opencv图像融合

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

代码随想录算法训练营第三十九天 | 62.不同路径,63. 不同路径 II

一、参考资料不同路径https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu不同路径 IIhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://progr…

Linux->父子进程初识和进程状态

目录 前言: 1. 父子进程创建 2. 进程状态 R(running)状态: S(sleep)状态: D(disk sleep)状态: T(stopped)状态: X(dead)和Z(zombie)状态: 孤儿进程: 前言: 本篇主要讲解关…

Python学习-----模块4.0(json字符串与json模块)

目录 1.json简介: 2.json对象 3.json模块 (1)json.dumps() 函数 (2)json.dumps() 函数 (3)json.loads() 函数 (4) json.load() 函数 4.总结: 1.json简介: SON(…

Mybatis之一级缓存二级缓存

介绍 缓存,就是将经常访问的数据,放到内存中,减少对数据库的访问,提高查询速度。Mybatis中也有缓存的概念,分为一级缓存和二级缓存。 一级缓存 一级缓存是Mybatis中SqlSession对象的缓存。当我们执行查询以后&#x…

C语言-结构体对齐

详细说明参考博客 (1条消息) C语言结构体对齐,超详细,超易懂_haozigegie的博客-CSDN博客 (1条消息) #pragma pack详解_OuJiang2021的博客-CSDN博客_#pragma pack 以下个人理解总结 出现结构体对齐考虑的根本原因就是:【数据存取执行效率】…

玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10

也许每一个男子全都有过这样的两个女人,至少两个。娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光;娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣。–…

网络原理 2

文章目录1. 网络层2. 数据链路层3. DNS前言 : 上文已经 将 网络层 和 传输层 说完了, 下面我们来学习以下 网络层 和 数据链路层 里 相关的知识 , 关于 网络层 和 数据链路层 的知识 简单了解一下即可 . 1. 网络层 网络层 主要 做两件事 : 1.地址管理…

如何优雅的用golang封装配置项(Functional Options)

导读 最近要封装一个公共服务,涉及到配置项的地方总是找不到合理的方案,后来看了一下grpc在配置方面的封装,了解到原来是golang特有的Functional Options编程模式,今天分享给大家,希望你能用到,咱们直接来看…

Linux 文件权限之umask

目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容,涉及到的内容有:文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类:文件所有者、文件…

忆享聚焦|人工智能、元宇宙、云计算、5G基站…近期热点资讯一览

“忆享聚焦”栏目第十二期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1.ChatGPT火爆全球 …

值传递和引用传递

什么叫 值传递&引用传递值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,…

2023不伤人脉的全新商城分销,一劳永逸的消费分红

2023不伤人脉的全新商城分销,一劳永逸的消费分红 2023-02-24 11:52梦龙 2023不伤人脉的全新商城分销,一劳永逸的消费分红 如今是流量为王的时代,但是如何将流量转化为忠实客户是个难题。不再是单向的买卖关系,而是从对产品的关注…

CSS 盒子模型【快速掌握知识点】

目录 一、什么是盒子模型 二、边框border-color 三、边框粗细border-width 四、边框样式border-style 五、外边距margin 六、内边距padding 七、圆角边框 八、圆形 九、盒子阴影 一、什么是盒子模型 css盒子模型又称为框模型,盒子的最内部是元素的实际内容…

国家调控油价预测案例+源码

项目git地址:https://github.com/Boris-2021/Oil-price-control-forecast 使用已知的历史数据:日期、汇率、布伦特、WTI、阿曼原油价格,预测下一个调价周期中的汽油、柴油零售限价的调价价格。 一. 需求 1.1 需求说明 使用已知的历史数据&a…

Linux:makefile小结

1.初学者要掌握的基本知识 一条规则: 两个函数 三个变量 2.自己写的makefile,说明每条命令的作用: #指定源文件为*.c src $(wildcard *.c) #通过src生成中间需要的汇编文件名,把src中.c替换为.o obj $(patsubst %.c, %.o, $(src)) #…

编译原理【文法设计】—每个a后面至少一个b、ab个数相等,ab个数不相等的所有串

编译原理【文法设计】—设计每个a后面至少一个b、ab个数相等,ab个数不相等的文法为字母表Σ{a,b}Σ\{a,b\}Σ{a,b}上的下列每个语言设计一个文法 (a) 每个a后面至少有一个b的所有串 首先,每个a后面至少有一个b的正规式怎么写呢?每个a都需要…