【操作系统】TCP/IP 协议的三次握手和四次挥手

1. TCP/IP 五层模型

应用层、传输层、网络层、数据链路层、物理层

如果把整个模型看做是一次网购我们可以这样理解各个层面的作用

应用层

应用程序直接打交道的协议(实际开发中涉及最多的部分,甚至需要自己设计应用层协议)HTTP就是在应用层上的协议

【它就可以看做是一个购物平台,通过这个平台的一些规定和要求,使得卖家和买家之间可以进行交易】

 

传输层

负责端到端之间的传输(只关注起点和终点)TCP 协议和 UDP 协议就是在传输层上的协议

【就相当于卖家只关注收件人的地址,只需要考虑我的商品应该从哪里寄到哪里】

 

网络层

负责点到点之间的传输(需要规划路径)

【这里就相当于物流公司,需要规划这两点之间我应该走怎样的路线】

 

数据链路层

负责相邻点之间的具体的传输方式

【例如物流公司规划好路径以后,他需要考虑是通过什么样的交通方式去运输,陆路还是空运等问题】

 

物理层

这是网络通信的基础设施(网站、基站、光纤)

【相当于铁路、公路、港头等】

 

总结:

上层协议调用下层协议,下层协议给上层协议提供服务

传输层和网络层都输纯软件协议,由擦欧洲哦系统内核实现;数据链路层和物理层与系统没有直接关系,而是取决于具体的硬件设施

 

2. TCP/IP的两个核心操作

封装、分用

就相当于包快递和拆快递的过程

2.1 封装过程

我的主机

1、应用层(QQ)需要根据用户输入的数据,把这个数据构造成一个应用层数据报。这个构造数据包的过程,就可以想象成是一个字符串拼接(序列化)。

 

2、应用层协议把数据要交给传输层协议,来进一步封装。封装的意思就是给刚才的数据基础上再加上一个传输层协议报头。(报头:也是字符串连接,可以看成发快递的标签)

 

3、传输层需要把数据进一步的交给网络层,网络协议再加上一个网络层的协议报头。【传输层数据包:帧()】

 

4、网络层还需要进一步把数据交给数据链路层,数据链路层的协议帧头+帧尾【网络层数据包:包】

【例】我想从 A 到 C 需要经过 B

我的整个数据报中:

网络层:源ip始终是A,目的ip始终是 C

数据链路层:源mac 和目的mac 随着我的行程而改变,最开始的源mac 是 A ,目的mac 是 B,当我到了 B 以后,源mac 就变成了 B,目的mac 就变成了 C

 

5、数据链路层得到的数据帧,还要交给物理层,物理层就会把这个数据转换成光电信号,通过硬件设备(网线、光纤、电磁波……)传输出去了

 

中间是怎么传输的暂时不描述,直接看分用的过程,也就是小明收到我的消息后主机怎么处理

2.2 分用过程

1、物理层接收到对方法来的光电信号,解析成二进制的 bit 流,进一步得到了数据链路层数据帧,把数据帧交给链路层来处理

2、数据链路层解析数据帧,剥离帧头、帧尾,取出中间的IP,把数据交给网络层

 

3、网络层拿到刚才的网络层数据包,再来解析,去掉网络协议报头,把数据交给传输层

 

4、传输层协议拿到传输层数据包,再来解析,去掉传输层报头,把应用层数据报交给应用层

 

5、应用层解析应用层数据报,分析出数据内容是啥,发送者是谁,显示到界面上,此时小明就能看见我的消息了

 

3. TCP 连接的建立(三次握手)

 

客户端的请求到达服务器,首先就是建立 TCP 连接

  1. client 收现发送一个连接试探,ACK = 0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接收报文,seq = x 表示 client 自己的初始序列号,这时候 client 进入 syn_sent 状态,表示客户端等待服务器的恢复
  2. server 监听到连接请求报文后,如同意建立连接,则向 client 发送确认。TCP 报文首部中的 SYN 和 ACK 都置为 1,ack = x +1 表示期望收到对方下一个报文段的第一个数据字节序号是 x+1,同时表示 x 为止的所有数据都已经正确收到。此时服务器进入 syn_rcvd 状态,表示服务器已经收到了 client 的连接请求,等待 client 确认
  3. client 收到请求后还需要再次发送确认,同时携带要发送给 server 的数据。ACK 置为 1 表示确认号 ack= y+1 有效,client 自己的序列号 x + 1,一旦收到 client 的确认后,这个 TCP 连接就进入 Established 状态,就可以发起 http 请求了

 

3.1 TCP 为什么要握手3次

两个计算机通信是靠协议来实现的,如果两个计算机使用的协议不一致,那就不能进行通信,所以三次握手相当于试探一下对方是否使用的是 TCP/IP 协议,协商后就可以进行通信了。如果是两次,那么,就有可能出现丢包的情况,进而,服务器就不能让对方确定自己可以接受到对方的信息。

3.1.1 为什么不是两次?

因为需要考虑丢包的情况,如果只握手两次,第二次握手是服务端发送给客户端的报文段丢失,此时服务端已经准备好收发数据,而客户端一直没有收到服务端的确认报文,所以客户端就不知道服务端是否准备好了,这种情况下,客户端不能给服务端发送数据,也会忽略服务端发送过来的数据,三次握手如果发生了丢包也不会有问题,如果第三次握手是,客户端发的确认报文 ack 丢失,服务端在一段时间呢没有收到 ack 报文就会重新进行第二次握手,也就是重发 SYN 报文段,客户端收到重发的报文段后会再次发送确认 ack 报文。

 

4. TCP 四次挥手

当客户端和服务器通过三次握手建立了 TCP 连接后,数据传送完毕就需要断开连接,那么 TCP 断开连接需要的是四次挥手

 

  1. · 当客户端的数据都传输完成后,客户端向服务端发出连接释放报文,释放连接报文包含 FIN 标志位 (FIN = 1),序列号 seq = u,注意客户端发送 FIN 报文段后只是不能发数据了,但是还可以正常收数据。
  2. 服务端收到客户端发的 FIN 报文后给客户端回复确认报文,确认报文包含 CK 标志位(ACK = 1)、序列号 ack = u+1、seq = v。此时服务端处于关闭等待状态,而不是立刻给客户端发送 FIN 报文,这个状态还需要持续一段时间,因为服务端可能还有数据没有发送完。
  3. 服务端将最后数据发送完毕后向客户端发出释放连接报文,报文包含 FIN 和 ACK 标志位(FIN = 1,ACK = 1)、确认号与上一次的序列号相同 ack = u + 1,序列号为 w
  4. 客户端手到服务端发送的 FIN 报文后,向服务端发出确认报文,确定报文包含 ACK 标志位(ACK = 1)、确认号ack = w + 1,seq = u + 1,与上一次的确认号相同。注意客户端发出确认报文后不是立刻关闭,而是经过 2MSL(最长报文段寿命的 2 倍时长)后才释放连接。而服务端一旦收到客户端发出的确认报文就会立刻释放 TCP 连接,所以服务端结束 TCP 连接要比客户端早一些。

5. 常见问题

5.1 为什么建立连接时三次,关闭却是四次?

因为只有客户端和服务端都没有数据要发送了以后才能断开 TCP 连接,而客户端发出 FIN 报文时只能保证客户端没有数据要发送了,服务端还有没有数据要发送客户端不知道。而服务端收到客户端的 FIN 报文后只能先回复客户端确认报文来告诉客户端我知道你没有数据要发送了,但是我服务端还有一些数据没有发送完,等这些数据发送完了才能给客户端发送 FIN 报文,所以不能在发送确认报文的时候直接发送 FIN 报文。

 

5.2 为什么客户端发出第四次挥手的确认报文后还要等待 2MSL 的时间才释放连接

这里同样也是要考虑丢包的问题,如果,第四次回收的报文丢失了,服务端没有收到确认 ack 报文,就会重新发送第三次回收的报文,这样报文一去一回最长时间就是 2MSL ,所以就需要等待这么长的时间来确认服务端确实是收到了

 

5.3 如果已经建立了连接,客户端出现了故障怎么办

TCP 设有一个保活计时器,客户端如果出现故障,服务器不会一直等下去,服务器没收到一次客户端发送的请求后就会重新复位这个计时器,时间通常是 2 个小时没如果两个小时都没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔 75 秒就发送一次,若一连发送了 10 个探测报文仍没有反应,服务器就认为客户端出现了故障,接着就关闭连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值