当前位置:   article > 正文

TCP/IP 三次握手_tcp三次握手

tcp三次握手

TCP/IP协议

        互联网协议(Internet Protocol Suite)是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。它常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。

一、TCP/IP 三次握手

概念:指在发送数据的准备阶段,需要先建立连接,(三次握手来建立连接)

想一个日常场景:

你和朋友打电话的时候,信号不好,你们正式通过之前要确认对方能听到自己说话。

场景肯定是这样的:

你:你能听到我说话吗?

你朋友:我能听到你说话,你能听到我说话吗?

你:我能听到你说话

这就三次握手建立了连接,双方确认了都能听到对方的说话,然后接下来开始交谈正式内容了。

自己的理解:

三次握手,就是在建立连接。如何定义建立连接?

一、就是A给B发送消息1 (A只知道自己刚刚发送了消息,但是发没发送成功,B有没有收到?A是不知道的,万一网络不好消息丢了呢或者B的协议不对,不能收到A的消息呢)

二、B给A发送消息2,告诉A,B刚刚收到了消息1,(此时,A给B发送消息,确认B是可以收到的A的消息,但是A有没有收到B的消息2,我们是不知道的,我们只是发出了消息,不确定收到消息没,万一消息2发丢了呢)

三、所以第三次,就是A再给B发送消息,告诉B,A可以收到B的消息。

三次握手完成,双方确认了都可以收到对方消息,这就建立连接成功了

同步序号:SYN   确认字段:ACK  随机数据:seq

规定:

当SYN=1,ACK=0表示连接请求

当SYN=1,ACK=1表示同意建立连接

如上图,纵向的轴,是一个时间轴。

第一次握手:时间点1,客户端向服务端发送连接请求报文段。ACK=0,SYN=1,seq=x

将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

完成了三次握手,客户端和服务器端就可以开始传送数据。

为什么是三次握手?而不是两次握手

原因1: 两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
 

接着上面的那个打电话的日常场景如果是2次握手话,场景就是这样的。

你:你能听到我说话吗?

你朋友:我能听到你说话,你能听到我说话吗?

你:我能听到你说话

只是确认了对方能听到你说话,但是不能确认你能听到你朋友的说话。

如果两次握手,就正式谈话,如果你听不到你朋友的声音,这些你朋友给你说的话不就丢失了么。

无法保证服务器与客户端的连接是建立成功的。

三次握手过程:

第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

原因2:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/148884
推荐阅读
相关标签
  

闽ICP备14008679号