• 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (1)三次握手,四次挥手


    18.1 引言

    TCP 是一个面向连接的协议:无论哪一方 向 另一方 发送数据之前,都必须在双方之间建立一条连接。
    UDP 与 TCP 完全不同,在发送数据之前 无需建立任何连接。这也说明了 TCP 的特性:reliable 。

    18.2 连接的建立与终止

    18.2.1

    telnet命令在与 丢弃(discard) 服务 对应的端口上 与主机建立一条TCP连接。

    显示序号 和 隐含结尾序号 的优点:便于了解数据字节数大于0时的 隐含结尾序号。
    这个字段只有在满足以下条件时才显示:

    • (1)报文段中 至少包含一个数据字节
    • (2)SYN FIN 或者 RST 被设置为1 的时候

    18.2.3 建立连接协议

    三次握手

    (1)请求端(client) 发送一个 SYN端 指明 1)客户打算连接的服务器的端口 2)初始序号 ISN
    (2)接收端(server) 发回包含服务器的初始序号的 SYN报文段(含 ACK) 进行确认,同时 将确认序号(ACK字段 置为1时 有效)设置为 客户的初始序号ISN +1 以对客户的 SYN报文段 进行确认。
    (3)客户 必须发送 **将确认序号 设置为 服务器的 ISN+1 **的 SYN报文段 进行确认(ACK)。

    以上三个过程 称为“三次握手”。

    (1)client ---Hello, can I speak to you? & client-ISN:J---> server
    
    (2)client <---ACK: Yes, I receive your request! & server-ISN:K ACK:J+1--- server
    
    (3)client ---ACK: Okey, thank you for your permission! Let's start! & ACK:K+1 ---> server
    

    发送第一个 SYN 的一端(一般都由 客户端 client 发起),将执行 主动打开(active open)。 接收这个 SYN报文段 并 发送下一个带有ACK的 SYN报文段 的一端(一般都是 server),将执行 被动打开(passive open)。
    当一端为建立连接 发送它的 SYN 的时候,它为连接选择一个 初始序号(ISN),初始序号的值 随时间的变化而变化。
    选择序号的目的:防止在网络中 被延迟的分组 在之后又被传送,导致连接的一端做出错误的解释。我们将在后面的 “来自该连接的 较早替身 的迟到报文段” 再进行理解。

    18.2.4 连接终止协议

    四次挥手

    连接终止 需要 四次挥手,而这是由 TCP的半关闭 导致的。TCP连接 是双全工的:通信允许两个方向进行传输。
    由于 TCP连接 是 双全工 的,因此 每个方向都必须 单独的进行关闭

    第一次挥手:(1)首先进行发送的一方(一般是 client,但是 也可以是 server) 发送第一个 FIN 将执行 主动关闭,发送端的应用层关闭之后,才发送的 第一个FIN。 此时,发送端不能够再发送数据了,但是仍然可以接收数据。(附:这对 利用半关闭的应用 来说是可能的,但是很少的TCP应用程序这样做。)

    第二次挥手:(2)接收到 第一个 FIN 的另外一方(一般是 server),返回一个 FIN的ACK 给发送端,确认序号 为 收到的序号+1。和 SYN 一样,FIN 也将占用一个序号。

    (3)接着 接收端-server 向应用程序交送EOF(end of file),代表从 发送端 接收数据的结束。

    第三次挥手:(4)接收端-server 关闭它的进程(关闭应用层),并发送 FIN 给 发送端-client。

    第四次挥手:(5)发送端-client 接收到这个 FIN,并发送一个 FIN的ACK 给 接收端-server,确认序号 设置为 收到的序号+1。

    注意:

    • 确认序号 只有在 ACK字段为1 的情况下才有效,也就是说,发送请求的 是 序号,返回的ACK 是 确认序号(值为 序号+1)。
    (1)client ---FIN: Hey,man. I finished my application, I will not send any data to you! Bye! & 序号 M ---> server
    
    (2)client <---ACK: OKey, I will not receive your data. & 确认序号 M+1 --- server
    
    (3)server ---EOF---> server-application
    
    (4)client <---FIN: Goodbye, I will not send any data to you, too! & 序号 N --- server
    
    (5)client ---ACK: Okey, bye! & 确认序号 N+1 ---> server
    

    总的过程:

    18.4 最大报文段长度

    最大报文段长度(MSS) 表示TCP传往另外一端的最大块数据的长度。
    当建立一个连接的时候,连接的双方都要通告各自的 MSS。

    • 报文段越大 允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的 网络利用率。
    • 对于一个以太网,MSS可达 1460字节,使用 IEEE 802.3的封装,它的MSS可达1452字节。

    如果目的IP地址为 “非本地的(nonlocal)”, MSS 默认值为536.
    区别地址 是 本地的 还是 非本地的:

    • (1)目的IP地址的网络号和子网号 都和我们相同,一定是本地的。
    • (2)目的IP地址的网络号和子网号 都和我们不同,一定是非本地的。
    • (3)目的IP地址的网络号和我们相同,但是子网号不同,可能是本地的,也可能是非本地的。

    MSS 让主机限制另外一端发送数据报的长度。

    也就是说,数据报的长度,目前取决于两点:(1)建立连接时的 MSS (2)由 Traceroute(设置不分片)程序产生的数据报 确定的路径MTU。
    通过这两点的限制,防止了数据报的分片。

    2016/8/10

  • 相关阅读:
    精准测试
    git 管理
    git
    代码覆盖率测试
    vue 前端视频
    jenkins
    go学习资料
    4-4 求自定类型元素的平均
    4-3 简单求和
    4-2 多项式求值
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5759129.html
Copyright © 2020-2023  润新知