• 计网-四次挥手


    技术这种东西,只要有时间,有毅力总是能够学会的

    之前看到了很多的文章写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连接来传输的,所以之后挥手的时候,虽然说连接断开了,但是并不会影响请求和响应。所以这也是题目为什么只写了四次挥手的原因。希望可以帮助你们。晚安!

  • 相关阅读:
    Js中的正则表达式
    js内存泄露的几种情况
    JavaScript的setTimeout与setInterval执行时机
    IE模拟addDOMLoadEvent和jQuery的ready实现
    谈谈JavaScript的异步实现
    在iOS7中修改状态栏字体的颜色
    IOS 疯狂基础之 页面间跳转
    ATL2.1版的CString分析
    翻译: 如何改变MFC应用程序主窗口的类名
    VC5.0中的ATL的一个有趣的bug
  • 原文地址:https://www.cnblogs.com/kevin-lee123/p/7482463.html
Copyright © 2020-2023  润新知