0
点赞
收藏
分享

微信扫一扫

四、面向连接的TCP协议——连接的建立与断开

Separes 2022-01-17 阅读 88

0. 引言

在上一节中,以现实中的邮政系统为例,各层的计算机网络协议分别有着对应和特点

计算机网络邮政系统特点
物理层马路航线水面是真实世界中的载体(机械,电气,功能,过程特性)
数据链路层高速路上的快递车司机
城市内的跑腿小哥
1. 货物被打包到快递盒内(封装成帧)
2. 啥货物只要打包好都可以送(透明传输)
3. 保证货物不被雨淋损坏(差错控制)
【而且不知道运的是什么,只保证将货物安然无恙的送到目的地】
网络层邮政中央调度系统1. 每个片区分配一个唯一的邮政编码(IP地址)
2. 负责规划运输路线(最佳路径)
3. 出错了要及时处理(网际控制)
传输层小区内的服务点1. 一个邮政编码的片区里会有多个服务点(一个主机内有多个端口)
2. 服务点与服务点之间传输(点对点)
3. 用户只管寄货,不用管怎么运的(逻辑传输)
应用层每个客户各种各样具体的需求,例如生鲜运输冷链,邮报系统…

我们把传输层比作邮政系统内的服务点,而服务点又根据用户的需求将业务分为了两大类:

  1. 收发快递——UDP协议
  2. 信件交流——TCP协议

在本文里我们就来着重分析一下TCP协议。

1. TCP协议的特点

类比与打电话,TCP这种业务的特点在于:

  1. 打电话要双方在场,且接通(TCP是面向连接的)
  2. 打电话只能一对一(TCP是一对一的)
  3. 打电话双方都能听到对方的所有内容(TCP是可靠交付的)
  4. 打电话能说也能听(TCP是全双工的)
  5. 打电话交换的是“话”(TCP是面对数据流

2. 连接的一生?——如何建立和断开

既然TCP是面向连接的,那问题自然就出来了

  1. 如何建立连接?
  2. 如何断开连接?

2.1 Hello?——连接的建立

连接建立的最基本原则“每一方都能确知对方的存在”。

那一个问题就是:

接下来,我们就以表白确定恋爱关系的例子探索这个问题

a. 一次交谈——“舔狗的单相思”

就像舔狗的单相思一样,一次交谈显然是不够的。

因为你的女神可能根本不想鸟你(/狗头),啊哈哈哈。

b. 两次交谈——“我孩子都出生了!”

那两次呢?表面看起来女神回复了就可以,但是有一种情况如下:

在这种情况下,很荣幸你女神答应你了!

但是不幸的是… 你孩子都出生了。

所以两次是不够的,这是因为客户端可能会因为超时而退出

c. 三次交谈——“大功告成”

正如图中所示,三次交谈刚刚好,这样:

  1. 双方都能知道对方的态度
  2. 其中一方也不会因为时间太长而退出

总结:三次握手

所以在连接的建立中,需要三次交谈才能建立最基本的连接,这又被称为三次握手

三次握手的过程为:

  1. 第一次握手:客户端主动发送请求【客户端:我想连接,你在吗?】
    • 主动请求标志:SYN=1
    • 客户端序列号:seq=x
  2. 第二次握手:服务器端回答客户端【服务器端:久等,我在,可以连接,你还在吗?】
    • 连接建立标志:SYN=1
    • 回答标志:ACK=1
    • 服务器端序列号:seq=y
    • 回答对象:ack=x+1
  3. 第三次握手:客户端回答服务器端【客户端:我在我在!】
    • 回答标志:ACK=1
    • 客户端序列号:seq=x+1
    • 回答对象:ack=y+1

2.2 byebye!——连接的断开

类比于建立连接,最直接的感觉是连接的断开也只需要三次交谈。

但是其实不然,连接与断开的一个区别在于:

  • 断开的时候可能还有资源没有传输完毕(就像情侣分手了但是账还没有算清楚)

a. 不提倡的方式

b. 提倡的方式

总结:四次挥手

由于需要所有资源都传输完毕,不同于三次握手,断开连接的时候需要四次挥手。

四次挥手

  • 第一次挥手:客户端发送关闭连接的报文段【客户端:我想关闭】
    • 关闭标志:FIN=1
    • 客户端序列号:seq=u
  • 第二次挥手:服务器收到 FIN 报文后,发回确认报文【服务器端:收到了,等一下】
    • 确认标志:ACK=1
    • 服务器端序列号:seq=v
    • 确认对象:ack=u+1
  • 第三次挥手:服务器发送完所有数据后,会向客户端发送 FIN 报文段【服务器端:好了,传输完了,可以关闭】
    • 关闭标志:FIN=1
    • 确认标志:ACK=1
    • 服务器序号:seq=w
    • 确认对象:ack=u+1
  • 第四次挥手:客户端收到来自服务器的 FIN 报文段后,向服务器发送 ACK 报文【客户端:好了,明白,拜拜】
    • 确认标志:ACK=1
    • 客户端序号:seq=u+1
    • 确认对象:ack=w+1
举报

相关推荐

0 条评论