-
B对A说:我确认收到了你的x序列号报文,我的序列号是y,你准备好了吗?
-
A对B说:我确认收到了你的y序列号报文,我的序列号是x+1
根据上面的描述,我们需要两个标志位
-
SYN(synchronize)是指这个报文的目的是同步连接需要,即用于表示“你准备好了吗?”。
-
ACK(acknowledge)是指确认报文,即“我确认收到了你的报文”。
还需要两个值
-
seq(sequence number)是报文的序列号,即“我的序列号是x”,每个报文都应该有序列号用于表示顺序。
-
ack(acknowledge number)是报文应答的确认号,即“我确认收到了你的x序列号报文”,如果接收了x序列号的报文,确认号为x+1。
这样我们可以表示出三次握手的具体报文为
-
A向B发送:SYN=1,seq=x
-
B向A发送:SYN=1,seq=y,ACK=1,ack=x+1
-
A向B发送:seq=x+1,ACK=1,ack=y+1
TCP头如下图所示,其包含了三次握手中需要的标志位(SYN、ACK)和两个值(序号和确认号)。
在三次握手中初步展示了TCP头的格式,本节我们根据TCP头来看一下TCP协议。
数据是如何传递给不同进程的
进程各自占据了单独的端口号,因此只要知道了端口,就能知道数据应该传递给哪个应用。在TCP头部保存源端口和目的端口,从而知晓这个数据是从哪里来要到哪里去,接收方拿到数据包后调换源端口和目的端口后回传数据。
如何发送并接收字节流
TCP是一个基于字节流的协议,发送和接收的数据都是字节流,TCP协议通过设置发送和接收窗口来完成数据的传递。这两个窗口的大小不固定,因而称为滑动窗口,这样可以在各种网络条件下保证接收方来得及接收。那么接收方是如何告知发送方这个窗口的大小呢,这就靠TCP头中的“窗口”部分进行控制。
以下图为例,接收方告知发送方当前的窗口值为20字节,那么发送窗口从收到确认的最后一个字节(即30)开始,设定了[31,50]
的发送窗口,该窗口内字节允许被发送;接收方在收到一系列有序的字节后,对最后一个按序收到的字节进行确认。
从TCP头中可以看出,这个窗口值
的大小使用2字节表示,最大只能到64KB,这显然是不够的。因此TCP后来引入了缩放因子,用于对窗口值大小的倍率转换。这个值作为扩展字段在TCP头中的“选项”中存储,使用「种类,长度,值」
三元组进行表示,窗口缩放值的种类值为3。
四次挥手
-
A对B说:我的序列号为x,我要关闭连接
-
B对A说:我确认收到了你的x序列号报文,我的序列号为y
-
B向A发送完剩余的数据
-
B对A说:我确认收到了你的x序列号报文,我的序列号为z,我要关闭链接
-
A对B说:我确认收到了你的z序列号报文
根据上面的描述,除了ACK外还需要一个标志位FIN
FIN(finish):告诉对方我要关闭连接,之后不再发送数据。
这样我们可以表示出四次挥手的具体报文为
-
A向B发送:seq=x,FIN=1
-
B向A发送:seq=y,ACK=1,ack=x+1
-
B向A发送完剩余的数据
-
B向A发送:seq=z,ACK=1,ack=x+1,FIN=1
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档
还有更多面试复习笔记分享如下
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
下**
[外链图片转存中…(img-CKbl31zP-1712306799644)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!