http三次握手_网络是如何连接起来的?详解TCP三次握手

从HTTP说起

互联网的通信都是遵循着一定的协议的,通信双方必须经过一些约定俗成的协议才能互相通信,不然我说中文,你说英文,两者相互听不懂对方的消息,这样是无法通信的,因此就必须约定双方都说中文或者英文,这样双方才能完美地进行通信。因此,互联网中一定得存在着各种各样的通信协议,才能相互的通信。

当我们使用浏览器访问某网站的时候,如当访问百度的时候,浏览器都会自动地在www.baidu.com前面加上http://这个东东,变成http://www.baidu.com,然后再去发起请求。http://这个东东就表明了我们的浏览器是以http协议去访问百度的服务器的。

那么是不是单单只有这种协议呢,不,完成不同的需求就需要不同的协议,比如上述的网页访问用到了HTTP协议,还有为提供可靠且有效的电子邮件传输而定义的SMTP协议、基于文件的传输而定义了FTP协议等等,这些协议都是应用层级别的协议,在计算机网络中,为了降低耦合度,类似函数之间的方法调用,采用了协议栈的概念,有OSI七层协议体系结构,也有TCP/IP四层协议体系结构,我们经常采用的是综合两者的有点,定义了一种只有五层协议的体系结构。传输层、网络层、数据链路层的协议都是通过操作系统内核去处理的,而应用层通过调用这些操作系统内核的代码去实现的,因此,可以说应用层的协议是基于下面的协议而实现的。

5028193ae2effcca96aec3222df9dd9c.png

因此浏览器访问服务器的过程就可以抽象为如下图,这也是http协议的基本工作方式。客户进程(浏览器)的位置在最高的应用层,它向服务器主机的应用层服务器进程发出请求,请求建立连接,然后,服务器进程接受客户进程发来的请求。http只是一个应用层级别的协议,其实HTTP协议又是基于TCP协议的,TCP协议是传输层的东西。

ce1b70aa0956cf1a0734b48a5fdf6910.png

因此,更具体一点,所有的这些通信,实际上都需要使用下面各层所提供的服务,可以表现为下图。

42dbc7e04a9d488cc7f6b96d8bd3393e.png

可以看出HTTP协议定义了通信的双方通信前必须要建立好连接,HTTP协议又是通过TCP协议去实现的,因此,HTTP中连接的建立、数据传送和连接的释放实则是由HTTP的底下运输层中的TCP协议去实现的。HTTP协议只是在TCP协议的基础上定义了一些属于自己的东西。

TCP的连接建立

因为TCP连接是可靠的连接,因此必须保障每一方都能够确知对方的存在,所以必须先经过建立连接的过程,使双方都在连接上,每一方都知道对方存在,才是保障可靠连接的前提。TCP建立连接的过程叫做握手,握手需要在客户与服务器之间交换三个TCP报文段,如下图为TCP建立连接的三次握手过程。

4bcd5ae64767b0f8ee52da415cfa5534.png

上图中客户端有CLOSED、SYN-SENT、ESTABLISHED三种状态,服务器有CLOSED、LISTEN、SYN-RCVD、ESTABLISHED四种状态。

CLOSED为关闭状态,是客户端与服务器端没有进行任何操作时候的状态,当服务器端开启监听端口的时候,服务器端变成LISTEN状态,监听和接收客户端的请求连接报文。

① 客户端发出打算建立TCP连接的请求报文,报文首部中的SYN位=1,说明该报文不能携带数据,但是要消耗一个序号(seq)。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,该编号即为序号(seq)。该请求建立连接报文中选择一个初始序号seq=x,但是不携带数据。此时,TCP客户端进程进入SYN-SENT(同步已发送)状态。

② 服务端监听端口接收到请求后,如同意建立连接,则向客户端发送确认。在确认报文段中将SYN位和ACK位都置为1,SYN位=1说明该报文不携带数据,但同样也要消耗掉一个序号和选择一个初始序号seq=y。ACK位=1说明该报文中的确认号有效,确认号是ack=x+1,表示希望客户端传输的下一个序号为x+1(因为客户端在第一步已经发了一个序号为x的报文)。此时TCP服务器进程进入SYN-RCVD(同步收到)状态。

③ 客户端收到服务器的确认后,还要给服务器发出确认,故先将该确认报文段的ACK置为1,确认号ack=y+1,表示希望服务器端传输的下一个序号为y+1(因为服务器在上一步中已经发了一个序号为y的报文),而自己的序号为seq=x+1。此时,TCP连接已经建立,双方都进入ESTABLISHED(已建立连接)状态。

还不明白?我们用通俗的话再来描述以上的三次握手过程!

① 客户端:服务器,我们可以建立连接吗?

② 服务器:可以啊,我们建立连接吧!

③ 客户端:收到,建立连接吧!

然后建立TCP连接成功

如果是四次握手的话,就变成了如下

① 客户端:服务器,我们可以建立连接吗?

② 服务器:可以啊,我们建立连接吧!

③ 客户端:收到,我们建立连接吧!

④ 服务器:收到,我们建立连接吧!

然后建立TCP连接成功

服务器在②中都已经答应建立连接了,就不用再答应建立连接了,因此第4次握手是没有必要的。

那为什么不来2次握手呢?

① 客户端:服务器,我们可以建立连接吗?

② 服务器:可以啊,我们建立连接吧!

第一个原因:

两次握手中,客户端知道了服务器具有接收信息和发送信息的能力,但是服务器只知道客户端具有发送信息的能力,但是并不知道客户端具有接收信息的能力,如果加上第3次握手,服务器就知道了客户端具有接收信息的能力(因为客户端接收到了信息并且回复给服务器端)。

第二个原因:

现在考虑这么一种情况,由于网络拥堵,客户端发出的第一个连接请求报文段(第一次握手)在某些网络节点长时间滞留了,需要一些时间才能到达服务器。

c1472f7350443eed53e6f417bad9fac5.png

然后由于客户端没有收到服务器的确认报文,客户端就认为这个连接请求报文段(第一次握手)失效了,于是重新发送这个连接请求报文,这一次没有因为网络堵塞而滞留在网络中,成功发送到服务器端了,因为是两次握手,所以两次握手后,连接就成功建立了。

bd1628d9aa70946628cc34792d5ee591.png

客户端认为刚开始的那个由于网络拥堵而滞留在网络中的请求连接报文失效了,其实并没有失效,只是由于网络的拥堵而滞留在网络中而已,此时,网络不阻塞了,又畅通了,该报文成功到达了服务器,服务器又以为客户端要进行与服务器TCP的连接,于是服务器就又对这个连接请求报文进行应答,同意建立连接。假定不采用第三次握手,那么只要服务器发出确认,新的连接就建立了。

a3eb778e8c0494fa50b8cd5e0056c80f.png

由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器端的确认,也不会向服务器端发送数据。但服务器端却以为新的运输连接已经建立了,并一直等待客户端发来数据。服务器端的许多资源就这样白白浪费了。

d8d5f97ba28a69b4ef500842b9bc7359.png

因此,需要第三次握手来解决该问题,第三次握手是客户端发给服务器端的确认报文,如果服务器端过了规定的时间都没收到客户端的回复确认报文,于是也不会为客户端分配资源,因此,此次的连接就放弃啦,也不会耗费服务器端的资源了。

全文完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP三次握手和四次挥手是TCP协议建立和关闭连接时所采用的步骤。 三次握手是在客户端和服务器之间建立TCP连接时的过程。首先,客户端向服务器发送一个请求连接的数据包,该数据包包含一个随机生成的序列号(SYN),表示客户端希望建立连接。服务器接收到该请求后,向客户端回复一个确认连接的数据包,该数据包包含其自己生成的一个随机序列号(SYN-ACK),表示服务器同意建立连接。最后,客户端再次向服务器发送一个确认连接的数据包,该数据包中包含服务器的序列号加一(ACK),表示客户端接受服务器的连接请求。这样,TCP连接就建立起来了。 四次挥手是在客户端和服务器关闭TCP连接时的过程。首先,客户端发送一个关闭连接的请求数据包(FIN),表示客户端想要关闭连接。服务器收到该请求后,向客户端回复一个确认关闭连接的数据包(ACK),但自己的数据可能没有发送完毕。服务器等到自己的数据发送完毕后,发送一个自己的关闭连接请求数据包(FIN),表示服务器也希望关闭连接。客户端收到服务器的请求后,回复一个确认关闭连接的数据包(ACK),然后等待一段时间,确保服务器收到了该数据包。最后,客户端和服务器都关闭连接,四次挥手过程完成。 通过Wireshark抓包分析TCP三次握手和四次挥手可以观察到每个数据包的源地址、目标地址、序列号、确认号等信息。可以通过Wireshark的过滤功能筛选出TCP协议相关的数据包进行分析。通过分析数据包的交互过程,可以确认连接建立和关闭的状态是否符合预期,并可以进一步分析网络延迟、丢包等问题。 综上所述,Wireshark抓包分析TCP三次握手和四次挥手可以帮助我们深入理解TCP连接的建立和关闭过程,以及发现网络故障的根源。 ### 回答2: TCP是一种常用的传输层协议,它通过进行三次握手来建立连接,并进行四次挥手来终止连接。 三次握手的过程如下: 1. 客户端发送一个SYN标志位的TCP报文段给服务器,表示请求建立连接; 2. 服务器收到请求后,回复一个带有SYN和ACK标志位的TCP报文段给客户端,表示同意建立连接; 3. 客户端收到服务器的回复后,再次发送一个带有ACK标志位的TCP报文段给服务器,表示连接建立成功。 四次挥手的过程如下: 1. 客户端发送一个FIN标志位的TCP报文段给服务器,表示希望断开连接; 2. 服务器收到请求后,回复一个带有ACK标志位的TCP报文段给客户端,表示确认收到断开请求; 3. 服务器完成数据的发送后,发送一个带有FIN标志位的TCP报文段给客户端,表示自己也要断开连接; 4. 客户端收到服务器的断开请求后,发送一个带有ACK标志位的TCP报文段给服务器,表示确认断开,并进入TIME_WAIT状态。 在三次握手的过程中,第一次握手是客户端发起的,第二次握手是服务器回复同意建立连接,第三次握手是客户端回复确认连接。这个过程是为了确保双方都同意建立连接,以保证数据传输的可靠性。 在四次挥手的过程中,首先客户端发送断开请求,服务器回复确认,然后服务器发送断开请求,客户端回复确认。这个过程是为了保证双方都断开连接,并确保数据完整性。 Wireshark是一款网络抓包分析工具。使用Wireshark可以捕获网络数据包,并对数据包进行解析和分析。通过Wireshark,我们可以看到每个TCP报文段的具体内容,并对三次握手和四次挥手的过程进行详细分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值