2020-04-14 tcp三次握手,以及一个tcp和http请求之间的关系

2020-04-14 tcp三次握手,以及一个tcp和http请求之间的关系,第1张

化繁为简是人们解决复杂问题的常用方法,对计算机网络划分就是为了将计算机网络这个庞大的复杂的问题划分为简单的问题。通过“分而治之”解决简单的问题,从而解决复杂的问题。

五层划分是根据ISO/OSI参考模型和TCP/IP体系结构而来的 为了更好的学习计算机网络。他的五层分别是(从低到高):物理层、数据链路层、网络层、传输层和应用层。

下面对以上几个层次进行简单的介绍

1、物理层

物理层为最底层。为数据链路层提供物理连接,传输比特流。物理层的特性包括电压、频率、数据传输速率、最大传输距离等。

2、数据链路层

数据链路层建立在通信和实体之间,传输以“帧”为单位的数据。保证点到点的可靠性传输。

3、网络层

网络层主要功能是为处在不同网络系统中的两个节点通信提供一条逻辑通道。基本任务包括路由选择、拥塞控制、网络互连等。

4、传输层(最关键的一层,TCP工作在这一层)

传输层为用户提供“端到端”的服务。透明的传送报文。他屏蔽了下次数据通信的细节,因此很关键。该层关系的主要问题是包括建立连接、维护和中断虚电路、传输差错校验和恢复,以及信息流量控制机制等。

5应用层

应用层是最靠近用户的OSI层,这一层作为用户的应用程序(例如电子邮件、 文件传输 和终端仿真)来提供网络服务。

我们假设A公司要给B公司发送邮件  老板叫 秘书来一下 你把这个邮件 寄到B公司 秘书找到顺丰快递告诉小哥 我要寄件 把这个寄到那那那(B公司地址等信息)然后快递小哥打包放在他车里 到了晚上或者某一规定时间 统一的 把他送到集散中心 装箱 送到 飞机上之后就是逆向过程 在这中间 秘书不需要知道 我的邮件是怎么运输的 我不管 你就给我运就行了 每一层 做自己的事情互不干扰。

TCP三次握手中有一些词要用到先简单解释一下

TCP序列号(序列码SN,Sequence Number) :32位的序列号标识了TCP报文中第一个byte在对应方向的传输中对应的字节序号。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1,单位是byte。

  TCP应答号(Acknowledgment   Number简称ACK Number或简称为ACK Field) :32位的ACK Number标识了报文发送端期望接收的字节序列。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

ACK(Acknowledgment) :取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。

SYN(Synchronize ) :同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。

FIN(Finish) :带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。

上图已经说明了三次握手的过程。

1、首先由主机A发出请求连接即 SYN=1 ACK=0  (请看上面的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=200

2、然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=500, ack=200+1,

3、再然后主机A再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=200+1, ack=500+1

然后连接建立
1、当主机A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1。

2、主机B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 

3、A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack =100+1(如图)。

4、 A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。

为什么要等待呢?

为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求WAIT_TIME会重新记时)

另外主机B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。

我在网上找了一个例子

三次握手:

A:“喂,你听得到吗?”A->SYN_SEND

B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:

A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED

TCP提供面向连接的可靠的(没有数据重复或丢失)全双工的数据流传输服务,每一个TCP连接可靠地建立,优雅的关闭,保证数据在连接关闭之前被可靠地投递到目的地。

UDP面向非连接的,不可靠的传输服务。它使用ip数据包携带数据,但增加了对给定主机上多个目标进行区分的能力。UDP既不使用确认信息对数据的到达进行确认,也不对收到的数据进行排序,因此可能出现丢失、重复、或乱序现象。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/13356512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存