引入

​ 随着时代的发展,计算机已经对我们社会和生活产生了深远的影响。计算机相关技术也被应用于各种各样的领域,有些人因此提出了“20世纪最伟大的发明就是计算机”。在笔者看来,到21世纪甚至以后的世界,计算机也会产生巨大的作用。

​ 前段时间的华为的鸿蒙系统比较火,而鸿蒙系统就是打通手机、电脑、平板、电视、汽车和智能穿戴等多种设备的统一操作系统。

​ “万物互联时代,没有人会是一座孤岛。无论经历多大的困难,华为为全球消费者提供更好的用户体验、更好的产品的决心不会改变。我们希望与更多合作伙伴、开发者共同繁荣鸿蒙生态,为全球消费者提供更好的体验、更好的产品、更好的服务。”华为常务董事、消费者业务CEO余承东在发布会接近尾声时上台致辞说了这样一段话。

image-20210923151609804

​ 上图就是新一代物联网应用场景图,想必读者很直观的可以看到万物互联时代带来的便利和美好,而今天我们就来聊聊最开始的“互联”——计算机互联。

计算机网络

​ 最开始的时候,计算机总是以单机模式被广泛使用。但是随着计算机技术的不断发展,人们就不满足于只能单机工作的计算机了,可能是一段迫切分享的信息,可能是一件需要协调的工作,导致了计算机互联的诞生。一台台计算机的连接,最后构成了网络状的计算机联系,这就形成了最早的计算机网络。

计算机网络,在维基百科中,将其称为是指容许节点分享资源的数字电信网络。笔者认为计算机网络正如其名,由计算机设备或者其他电子设备组成的一个网络状的连接关系。随着互联网的爆发式发展和普及,信息网络已经随处可见,现如今的计算机网络也发展成了一个庞大的体系了。

​ 一个体系的诞生通常伴随着各种规范和协议的诞生,谈及计算机网络,就不得不谈最家喻户晓的 OSI 模型和 TCP/IP模型。

网络体系结构

OSI 模型

OSI 模型是由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

​ 从下图可以看出该模型将通信系统中的数据流划分为七个层。每个中间层为其上一层提供功能,其自身功能则由其下一层提供。功能的类别通过标准的通信协议在软件中实现。

image-20210923153708838

TCP/IP 模型

​ 如下图所示 TCP/IP 模型只有四层,相当于 OSI 模型中应用、表示和会话层合并成应用层,数据链路层和物理层合并为网络接口层,TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。

image-20210923154023773

TCP/IP 参考模型是一个抽象的分层模型,这个模型中,所有的 TCP/IP 系列 网络协议 都归类到4个抽象的“层”中。每一抽象层创建在低一层提供的服务上,并且为高一层提供服务。 完成一些特定的任务需要众多的协议协同工作,这些协议分布在参考模型的不同层中的,因此有时称它们为一个协议栈

​ 由于现在网络中用的都是TCP/IP 参考模型,所以接下来我们着重讲 TCP/IP协议族 中的重要协议。

TCP/IP 协议族主要协议

​ 下图中就是TCP/IP 协议族中的主要协议了,这些协议相互协作,共同工作完成了我们日常生活中的许多需求,例如 HTTP (超文本传输协议),FTP(文件传输协议),DHCP(动态主机设定协议)等等。

image-20210923154652668

​ 因为该协议家族的两个核心协议:TCP(传输控制协议IP(网际协议,为该家族中最早通过的标准[3]。由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又称为TCP/IP协议栈

​ 在本篇文章中会先对最核心的 TCP 协议进行论述,其他还有许多重要的协议会放到之后的文章进行讲解。

TCP 协议

传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个与 TCP 相对的 无连接、不可靠 的重要传输协议,在之后我们还会再提到。

​ 提到 TCP 就不免提到它的三次握手和四次挥手,还有随之而来的许多扩展问题:可不可以是两次握手?可不可以是三次挥手?

三次握手

三次握手协议的过程:

​ 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SEND 状态。

首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

​ 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。

​ 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

image-20210923163513140

在上图中我们可以看出,三次握手就像张三和李四建立友好关系一样,但是这两个人文邹邹的,故事如下:

​ 张三:你好!我叫张三,我能和你做朋友吗

​ 李四今天正好心情不错,看见张三这个陌生人打招呼也回了句:张三你好,我知道你要和我做朋友了,我叫李四。

​ 张三一看李四的回应,心想,“有戏,又认识一个朋友”,俗话说得好,“多一个朋友多一条路”嘛,就又回到:我知道我们是朋友了,现在我们可以开始聊天(che dan)了。

然后张三和李四就开始了快乐的交流。

在网络中的两台计算机就像这样进行交流然后建立连接关系之后再进行数据交换,正如上面所提到的那个问题,可不可以是两次握手?

两次握手或者其他次握手行不行

答案是不可以!

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!通俗的来说就是两次无法保证可靠,而四次或者更多次握手又没有必要,所以TCP是三次握手。

在网上有许多说法关于三次握手的必要性:

image-20210923171915643

image-20210923172116772

image-20210923172323991

image-20210923172526005

四次挥手

如果说三次握手代表着关系的建立,那么对应的四次挥手就代表着关系的结束,也就是网络中的断连。

​ 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。

​ 即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

​ 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

​ 即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。

​ 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

​ 即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

​ 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

image-20210923173243645

可以从上面看出来,四次挥手其实是双方要断开连接时的一个协商过程:

​ 张三:李四啊,你看我们也聊了这么久了,天色也不早了,我也说了不少了,该回家了

​ 李四聊的正在兴头上,但是天色确实不早了,于是说:我知道你说完了,但是我还有一些事没说完

​ 于是李四:巴拉巴拉巴拉。。。

​ 李四觉得说的差不多了,也打算结束这次交流了:张三,我说完了,再见吧,有机会再聊。

​ 张三一看李四终于说完了:再见李四

然后张三和李四就开始了快乐的各回各家各找各妈了。

可不可以是三次挥手或者更少次

答案同样是不可以!

在上面的描述和演示图中我们可以看出来,四次挥手都很重要:

第一次是率先离开的甲方告诉另一方自己结束传输了;第二次是另一方的乙方回复甲方知道了,但是一般还会有数据需要传输,在这些或多或少的传输结束后;第三次乙方告诉甲方自己这边也结束传输了;最后一次甲方给乙方的回复是为了确保乙方知道 自己(甲方)已经收到乙方发出的结束传输报文了

感谢

本文参考 CS-Notes 以及 维基百科三次握手和四次挥手