TCP/IP协议族和TCP三次握手、四次挥手

166 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

TCP/IP协议是前端工程师必须要了解的知识内容,其中掌握TCP的三次握手和四次挥手,不管对日常开发接口请求、抓包、或者面试求职等都很有帮助。本文将针对TCP协议的三次握手和四次挥手进行详细分析。

TCP/IP协议族

TCP/IP是IP协议的通信过程中,使用到的协议族的统称。换句话说,就是计算机与网络设备之间通信的约定规则。

计算机和网络设备之间必须基于相同的方法才能互相通信。比如怎么找到另一个通信的设备,通信由两方的哪一方发起,使用哪种语言通信等等,这些都需要约定好。否则就像两个人在不同的地方用不同的语言沟通,两边都不知道对方的存在,就算知道了,也听不懂对方想表达什么意思。

TCP/IP分层管理

TCP/IP协议族按层次分为4层:应用层、传输层、网络层和数据链路层。

TCP/IP分层功能包含
应用层提供应用服务的通信活动HTTP、FTP(文件传输协议)、DNS(域名系统)等
传输层负责两台计算机等数据传输TCP(传输控制协议)、UDP(用户数据报协议)
网络层处理网络上流动的数据包,选择路由IP、ICMP、RIP、OSPF、BGP、IGMP
数据链路层处理连接网络等硬件部分控制操作系统、硬件的设备驱动、NIC(网卡)和光纤等物理可见部分

值得一提的是,IP网际协议属于网络层,它占据了TCP/IP的一半位置,即可见其重要性。IP协议的功能是获得分配的IP地址和MAC地址(网卡所属固定地址)等,将各种数据包传送给对方。 一般来说,通信传输通常都是经过多台计算机和网络设备中转才能完成连接,而中转则需要利用下一站的中转设备的MAC地址来搜索下一个传输目标。就与我们拨打公司的总机号到前台,前台再将电话转接到分机号一个道理。

利用TCP/IP协议族通信时,发送端会先从应用层开始往下走网络层,到接收端后再从网络层开始往上走到应用层,如下图。图中的箭头是双向的,表示发送端既可以是客户端也可以是服务器,接收端同理。

TCP_IP分层通信.drawio.png

在TCP/IP协议通信过程中,发送端从应用层到链路层的每一层,都会把上一层内容当成数据,在此基础上包上一层当前层的首部信息,相反,在接收端链路层到应用层的每一层都会解析当前层的首部得到下一层的信息,并消除当前层首部,这种数据信息包装方法称为封装。如下图所示:

TCP_IP解析过程.png

TCP协议属于传输层,在一个HTTP连接中,TCP协议的功能是提供可靠的字节流服务(将大块数据分割层报文段的数据包管理)。也就是说,TCP协议为了更容易传输把大数据分段分割后,并且会确保数据准确可靠的发送给对方。

那么TCP是如何确保数据从发送端准确的传输到接收方的呢?这里就用到了我们熟知的TCP三次握手策略了。

TCP三次握手和四次挥手

了解TCP连接

了解TCP三次握手过程,需要先了解下TCP首部结构。下图是TCP首部的结构图:

在TCP首部的结构图中,每一行代表一个字节,每个字节有32位。

  • 第一个字节包含源端口号和目的端口号,每个端口号占16位;

  • 第二个字节表示计算机随机生成数字,用来唯一标识该报文的当前序号(Seq);

  • 第三个字节32确认序号(ack)是对收到的TCP报文的确认,表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,其值是收到的TCP报文段序号值加1;

  • 第四个字节由4位首部长度、保留6位、6个标志位等组成,其中我们用到的ACK、SYN、FIN标志位各占1位,其值为二进制1或0,分别表示是和否。ACK位代表确认序号是否有效(注意大写ACK和小写ack应该区分开来),SYN位代表是否发起一个新的连接,而FIN位则表示是否需要结束一个TCP连接。

  • 校验和提供了额外的可靠性,紧急指针标记紧急数据在数据字段中的位置等。

TCP三次握手过程

TCP是全双工的,发送端和服务端互相发送信息。客户端想要发起一个新的连接时,需要像服务端发送SYN标志位为1到请求,称为三次握手,如下图所示:

TCP三次握手过程

TCP三次握手的流程:

  1. 第一次握手:客户端向服务端发送一个小的TCP分组数据,该分组中TCP首部SYN标志位为1,并且带有随机生成的Sequence序号,这里假设序号为10000,表示向服务端请求一个新的TCP连接。

  2. 第二次握手:如果服务器接受了连接请求,会向客户端回复一个TCP分组,这个分组中TCP首部SYN标志位为1,并且ACK标志位为1,表示确认同步(Synchronization acknowledgment)的意思,那么服务器也会生成自己的序号,假设序号为20000,并且服务器还会加上一个确认号,这个确认号就是根据客户端发来的序号加1,即10001。

  3. 第三次握手:客户端在接收到对方的回复后,就可以根据收到的确认号减1得到的值来判断是否是自己发送的TCP报文了,但是这时候还服务器不知道自己发送的SYN+ACK消息是否被客户端接受,因此客户端还需要向服务器发送一次TCP报文,其中ACK位为1,并且确认号根据收到服务端报文的序号加1,即20001,这样连接就正式建立了。

握手

注意示例中的客户端为发送端,服务端为接收端,而发送端既可以是客户端也可以是服务端,接收端同理。

TCP四次挥手

当客户端或者服务端想要断开连接时,会向对方发起断开连接请求,会有四个过程,称为四次挥手。

四次挥手

如上图所示,TCP四次挥手的流程为:

  1. 第一次挥手:客户端想要关闭连接时,向服务端发送一个TCP报文段,其首部的FIN标志位的值为1,这里FIN就是finish的意思,并且生成一个随机的序号,假设这个序号为26000。

  2. 第二次挥手:当服务端接收到客户端的FIN请求时,会发送一个ACK标志位的值为1的报文段进行确认,并且自己的序号会用对方的确认号,而自己的确认号则用对方的序号加1。

  3. 第三次挥手:这时候客户端不知道服务端是否还会有未发送的数据,因此客户端需要等待,直到服务端把所有数据发送完毕后,再发送给客户端一个FIN+ACK,并且生成一个自己的序号,假设这里为10930,表示确认可以关闭了。

  4. 第四次挥手:最后,客户端接收到服务端的FIN消息后,会发送一个ACK标志位为1的TCP报文段进行确认,该报文段的序号为对方的确认号,确认号为对方的序号加1,即10931。此时,TCP四次挥手结束,连接关闭。

结语

关于TCP三次挥手和四次握手的分享就到这里了。我是前端一叶子,微信公众号搜索 前端一叶子,关注我一起学习进阶前端。