• TCP之连接的建立和终止


    1. 连接的建立

    TCP 连接建立的三次握手


    如上图所示,TCP 连接的建立会发生如下述情形:

    1. 服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这 3 个函数来完成,我们称之为被动打开(passive open)。
    2. 客户通过调用 connect 发起主动打开(active open)。这导致客户 TCP 发送一个 SYN(同步)分节,它告诉服务器客户端将在(待建立的)连接中发送的数据的初始序列号。通常 SYN 分节不携带数据,其所在的 IP 数据报只含有一个 IP 首部、一个 TCP 首部及可能有的 TCP 选项。
    3. 服务器必须确认(ACK)客户的 SYN,同时自己也得发送一个 SYN 分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送 SYN 和对客户 SYN 的 ACK(确认)。
    4. 客户必须确认服务器的 SYN。

    TCP 连接的建立至少需要 3 个分组,因此称之为 TCP 的三次握手(threee-way handshake)。

    1.1 TCP 选项

    TCP 选项即 TCP 首部中的可选字段。每一个 SYN 可以含有多个 TCP 选项。下面是常用的 TCP 选项。

    TCP 选项的格式如下图:

    • 每个选项的开始是 1 字节的 kind 字段,说明选项的类型。kind 字段为 0 和 1 的选项仅占 1 个字节。其他的选项在 kind 字节后还有 len 字节。它说明的长度是指总长度,包括 kind 和 len 字节。
    • 设置无操作选项的原因在于允许发送方填充字段为 4 字节的倍数。

    MSS 选项

    发送 SYN 的 TCP 一端使用本选项通告对端它的最大分节大小(Maximum Segment Size)即 MSS,也就是它在本连接的每个 TCP 分节中愿意接受的最大数据量。发送端 TCP 使用接收端的 MSS 值作为所发送分节的最大大小。TCP_MAXSEG 套接字选项可以提取和设置这个 TCP 选项。

    窗口规模选项

    TCP 连接任何一端能够通告对端的最大窗口大小是 65535,因为在 TCP 首部中 窗口大小 的字段占 16bit。然而当今因特网上业已普及的高速网络连接或长延迟路径(卫星链路)要求有更大的窗口以获得尽可能大的吞吐量。这个新选项指定 TCP 首部中的通告窗口必须扩大(即左移)的位数(0~14),因此所提供的最大窗口接近 1GB(65535 * 2^14)。在一个 TCP 连接上使用窗口规模的前提是它的两个端系统必须都支持这个选项。可以使用 SO_RCVBUF 套接字选项影响这个 TCP 选项。

    注:客户端的 TCP 可以作为主动打开的部分内容随它的 SYN 发送该选项,但是只在对端也随它的 SYN 发送该选项的前提下,它才能扩大自己窗口的规模。类似的,服务器的 TCP 只有接收到随客户端的 SYN 到达的该选项时,才能发送该选项。

    时间戳选项

    这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。它是一个较新的选项,也以类似于窗口规模选项的方式协商处理。作为网络编程人员,无需考虑这个选项。

    1.2 三次握手抓包图示

    C: SYN J

    S: SYN K, ACK J+1

    C: ACK K+1

    2. 连接的终止

    TCP 连接终止的四次挥手

    1. 某个应用进程首先调用 close,称该端执行主动关闭(active close)。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕。
    2. 接收到这个 FIN 的对端执行被动关闭(passive close)。这个 FIN 由 TCP 确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为 FIN 的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
    3. 一段时间后,接收到这个文件结束符的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也发送一个 FIN。
    4. 接收这个最终 FIN 的原始发送端 TCP(即执行主动关闭的那一端)确认这个 FIN。

    2.1 四次挥手抓包图示

    假设是服务器先执行 close,抓到的包如下所示。

    S:FIN M

    C: ACK M + 1

    C: FIN N

    S: ACK N + 1

  • 相关阅读:
    修补瘪胎
    胎压监测系统(DWS)
    路径参数:Path Parameters
    C++线程池
    C++std::list
    C++std::is_same
    什么时候需要加锁
    C++14相比C++11多了的功能
    C++11关键字decltype
    C++std::result_of
  • 原文地址:https://www.cnblogs.com/jimodetiantang/p/9092500.html
Copyright © 2020-2023  润新知