技术这种东西,只要有时间,有毅力总是能够学会的
之前看到了很多的文章写TCP三次握手建立连接,四次挥手断开连接,期初看了一遍不懂,之后又遇到了另一篇将这个的,又看了一遍,看懂了,但是在此回想时,就又忘了。但是这一次,我想我可能不会忘了吧。
注:这是我自己完全评记忆写的,无任何参考,不足之处,敬请指出。
<b>三次握手</b>
主体:服务器、客户端
第一次握手:客户端想要从服务器上获取资源,所以发送一个请求建立TCP连接的数据包,其中ACK=1,seq=x;
第二次握手:服务器收到数据包后,表示可以建立连接,发送个客户端一个确认数据包,其中ACK=1,ack=x+1,seq=y;
第三次握手:客户端收到来自服务器的数据包后,再给服务器发送一个数据包说:“我收到你的确认数据包了”(1),服务器收到后,分配资源(2),建立连接,其中ack=y+1,seq=x+1;
再讲为什么要三次,而不是两次。首先来看看如果就是两次会是神马样子的。客户端发送一个请求连接数据包后,但是出现了网络拥塞或者延时,所以客户端不得不再发一个请求数据包,然后服务器就收到了,然后建立的连接,数据传输完成后,断开了连接。碰巧,开始发的第一个请求连接数据包到了,于是服务器为数据传输分配资源包括缓冲区,变量等(注意,因为客户端我不需要数据,所以不会理会来自服务器端的确认数据包,也就是不会建立连接)。浪费了服务器宝贵的资源,还有就是防止ARP洪泛攻击。
对于上面的ACK,seq,ack,这些东西最好看一下TCP头部格式,要是解释的话,就要写很多了,其中,好多地方都是需要解释的,但是还是得抓重点不是。
四次挥手
“咳咳,天下无不散的宴席”
数据传输完成后,客户端或者服务器端都是可以先请求断开连接的。不妨设先是客户端发起
第一次挥手:客户端发送一个请求断开连接的数据包,其中FIN=1,ACK=1;seq=x;
第二次挥手:服务器收到后很是难过,但是还是发送了一个确认数据包,然后就断开了客户端到服务器的连接,客户端不能向服务器发送数据了。其中ACK=1,ack=x+1.
第三次挥手:服务不需要向客户端传送数据的时候,就会向客户端发送一个请求断开连接的数据包,其中FIN=1,ACK=1,seq=y;
第四次挥手:客户端收到服务器的数据包后,好,那就是断开把,于是又发送了一个确认数据包。服务收到后,客户端等待2MSL时间后断开连接,这里MSL是报文最大生存时间,如果回应报文丢失,超时后,服务器再发送一个FIN报文,然后客户端再回复一个ACK报文,其中ACK=1,ack=y+1,.seq=x+1;
上面这些都不是我主要想说的,,,,,
因为这是在网上一搜,一大把帖子说的,我要说的是,既然TCP是全双工的--即两端可以同时通信,那么在第二次挥手的时候,明明客户端向服务器传送数据的那条连接已经断开了,它是怎么接受第三次挥手时的数据包的,怎么发送第四次挥手的响应包的,这些我没有看到有人说的,下面是我的理解:
从建立连接过程中,我们可以看出,其实这些请求包和响应包,并不是由TCP连接来传输的,所以之后挥手的时候,虽然说连接断开了,但是并不会影响请求和响应。所以这也是题目为什么只写了四次挥手的原因。希望可以帮助你们。晚安!