鱼C论坛

 找回密码
 立即注册
查看: 7295|回复: 26

[已解决]TCP连接时的三次握手

[复制链接]
发表于 2023-2-13 18:11:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在TCP建立连接过程中报文中的一些字段:
SYN=1,seq=x;
SyN=1,ACK=1,seq=y,ack=x+1;
SYN=0,ACK=1,seq=x+1,ack=y+1;

问题:
seq不是指本报文段所发送数据的第一个字节的序号吗,连接建立请求时不是没有数据吗,那这个seq有啥用?
服务器端发送确认报文时也要用到seq吗,他不是用来确认数据的吗?为啥也变化
最佳答案
2023-2-13 18:54:00
她与晚风 发表于 2023-2-13 18:41
可是SYN占一个字节不影响seq和ack的值吧,SYN不是包含在TCP首部吗

是这样的,但因为连接建立(和关闭)对这个协议非常关键,尽管这些控制位不占据数据空间,也要逻辑上将它们视为占据一个字节,并分配序列号
https://www.ietf.org/rfc/rfc9293.html#section-3.4-28
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-13 21:44:15 | 显示全部楼层
本帖最后由 cflying 于 2023-2-13 21:46 编辑

你可以把sep就理解成一个计数器,用来相互统计通讯序号数,便于对方知晓下一次从传输时大家起始数,免得下次来的数据鬼大爷知道是啥是时候的数据。
这样服务器就知道你收到了我的第1号数据,但是迟迟未回复2号数据,我还可以在有效时间内补发一个第2号数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:51:11 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 19:48
我认为是这样理解的

ok,反正序号是虚的,标了也不影响
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 19:48:49 | 显示全部楼层
她与晚风 发表于 2023-2-13 19:29
所以建立连接时数据部分明明没有内容,但仍然用seq赋了值(0/x)并且另一端报文中"ack=seq+1"这1个序号就是 ...

我认为是这样理解的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:29:58 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 18:54
是这样的,但因为连接建立(和关闭)对这个协议非常关键,尽管这些控制位不占据数据空间,也要逻辑上将它 ...

所以建立连接时数据部分明明没有内容,但仍然用seq赋了值(0/x)并且另一端报文中"ack=seq+1"这1个序号就是给它的是吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 19:09:30 | 显示全部楼层
她与晚风 发表于 2023-2-13 19:06
懂了你说的了,哥
还有最后一个问题:
seq就是序号吧,他的定义是本报文段发送数据的第一个字节的序列号还 ...

https://www.rfc-editor.org/rfc/rfc9293.html#section-3.1-6.6.2
一般是数据中第一个 octet 的序列号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 19:07:25 | 显示全部楼层

https://www.rfc-editor.org/rfc/rfc9293.html#name-initial-sequence-number-sel
https://www.rfc-editor.org/rfc/rfc9293.html#name-establishing-a-connection

TLDR: https://www.rfc-editor.org/rfc/rfc9293.html#section-3.4.1-10
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:06:26 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 19:02
ack 啊,另一方要确认自己收到了这个序列号

懂了你说的了,哥
还有最后一个问题:
seq就是序号吧,他的定义是本报文段发送数据的第一个字节的序列号还是最后一个啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:03:45 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 19:02
ack 啊,另一方要确认自己收到了这个序列号

互相确认是吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:03:01 | 显示全部楼层
dolly_yos2 发表于 2023-2-13 18:59
除了主动开启和被动开启,TCP 协议是对等的吧,处理序列号和确认号应该没有服务端/客户端的区别?

我不知道服务器端发送确认报文中的seq对客户端即将发送的第三次握手的报文有没有影响
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 19:02:39 | 显示全部楼层
她与晚风 发表于 2023-2-13 19:01
但服务器端发送的seq不会对客户端即将第三次握手里面的数据的有影响吧,如果有影响的是哪个字段呢

ack 啊,另一方要确认自己收到了这个序列号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 19:01:08 | 显示全部楼层
isdkz 发表于 2023-2-13 18:59
有作用的,因为他发确认的这个数据包也算他发的一个数据包

但服务器端发送的seq不会对客户端即将第三次握手里面的数据的有影响吧,如果有影响的是哪个字段呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 18:59:41 | 显示全部楼层
她与晚风 发表于 2023-2-13 18:56
哦哦,视频里面那个人好像讲错了我人麻了...
那服务器端发送确认时里面的seq对客户端没有任何作用吧!!!只 ...

除了主动开启和被动开启,TCP 协议是对等的吧,处理序列号和确认号应该没有服务端/客户端的区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 18:59:25 | 显示全部楼层
她与晚风 发表于 2023-2-13 18:56
哦哦,视频里面那个人好像讲错了我人麻了...
那服务器端发送确认时里面的seq对客户端没有任何作用吧!!!只 ...


有作用的,因为他发确认的这个数据包也算他发的一个数据包,有发送就肯定会有 seq
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 18:56:05 | 显示全部楼层
isdkz 发表于 2023-2-13 18:49
seq 是告诉对方发过去的最后一个字节的序号,而 ack 是响应对方收到了多少号之前的数据

哦哦,视频里面那个人好像讲错了我人麻了...
那服务器端发送确认时里面的seq对客户端没有任何作用吧!!!只是一个确认报文
只用ack = 客户端seq+1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 18:54:00 | 显示全部楼层    本楼为最佳答案   
她与晚风 发表于 2023-2-13 18:41
可是SYN占一个字节不影响seq和ack的值吧,SYN不是包含在TCP首部吗

是这样的,但因为连接建立(和关闭)对这个协议非常关键,尽管这些控制位不占据数据空间,也要逻辑上将它们视为占据一个字节,并分配序列号
https://www.ietf.org/rfc/rfc9293.html#section-3.4-28
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 18:53:38 | 显示全部楼层
她与晚风 发表于 2023-2-13 18:50
seq 也就是发过去的最后一个字节的序号吗?不是第一个字节的序号吗


不是,是发过去的最后一个字节的序号,他自己要发多少个字节自己最清楚了,所以他根据第一个字节的序号和要发的字节数就很容易算出来,

总不能发给对方然后让对方慢慢数发了多少个,然后再算吧,这是不可能的,太狗了,

更何况发送过程中还有可能有丢失的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 18:50:07 | 显示全部楼层
isdkz 发表于 2023-2-13 18:47
首先第一次握手时取了一个随机数字作为第一个字节的序号,假设这个随机数字是 3,

如果他要一次发3个 ...

seq 也就是发过去的最后一个字节的序号吗?不是第一个字节的序号吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-13 18:49:05 | 显示全部楼层
她与晚风 发表于 2023-2-13 18:37
而此时连接建立时没有数据那seq和ack作用是什么呢

seq 是告诉对方发过去的最后一个字节的序号,而 ack 是响应对方收到了多少号之前的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-13 18:48:30 | 显示全部楼层
客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN:Inital Sequence Number)是客户端随机产生的一个值,确认号是0;
服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;
客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。
————————————————
版权声明:本文为CSDN博主「qq_18145605」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-30 08:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表