• 握手7


    我们可以看到,TCP 的三次握手完全是在内核中实现的,对上层应用来讲完全是透明的。上层应用只负责收发数据,并不知道底层发生了什么哦。

    这样三次握手完了,可以看到三次握手,也就是建立连接时,双方交换三个报文。为什么是三次,这主要是为了防止已失效的连接请求报文段又传送到服务器端

    而产生差错。

    在正常情况下,假设客户端向服务器端发送连接请求报文,服务器端应该返回确认报文以证实这条连接。此时可能会出现两种错误:一种是客户端的连接请求报文

    丢失,另一种是服务器端的确认应答报文丢失。这两种情况都可以通过重传计时器超时来处理,一旦客户端的计时器超时,客户端再发一次连接请求报文,待到服务器端

    确认,就建立了连接。数据传输完毕后,再次释放本次连接。

    不过,建立连接必须考虑到网络服务的不可靠性。如果出现了这样的异常:假设客户端向服务器发送的第一个连接请求报文,该报文并没有丢失,而是滞留在网络中

    的时间过长,以至延误到在连接释放后才传送到服务器。这已经是一个失效的连接请求报文,但服务器端却把这个失效的连接请求误认为是客户端发送的新的连接请求。

    于是服务器会向客户端发送一个确认连接请求报文,同意建立连接。但实际上客户端并没有建立连接的要求,因此就不会理服务器端的确认,也不会向服务器传输数据,而

    服务器以为连接建立,一直等待客户端的数据,从而浪费服务器的资源。针对这种异常情况,采用三次握手,客户端就不会对服务器端发出的确认连接再确认,而服务器端也

    收不到客户端的确认,就知道客户端没有连接的请求。这样就防止了已失效的连接请求报文传到服务器端而出现的错误。

    此外,一对端口之间,只存在一个TCP 连接。

  • 相关阅读:
    C++拷贝构造函数(深拷贝,浅拷贝)
    C++标准库和标准模板库
    MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法
    MFC 对象与Win32 SDK 句柄的映射关系
    关于函数返回值的几种情况
    CreateWaitableTimer和SetWaitableTimer函数
    关于C++/C中防止头文件的重复包含的解决办法
    MFC 分割窗体(Splitter Windows)
    MFC中对话框的数据交换(DDX)和数据校验(DDV)
    MFC 消息映射表 及 相关宏定义
  • 原文地址:https://www.cnblogs.com/guoyu1024/p/10597317.html
Copyright © 2020-2023  润新知