博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tcp的连接和终止
阅读量:2224 次
发布时间:2019-05-08

本文共 1855 字,大约阅读时间需要 6 分钟。

1.TCP报头

        T C P将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; T C P提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

2.TCP连接的建立与终止

3.TCP的状态变迁

        导致两个进入ESTABLISHED状态的变迁对应打开一个连接,而两个导致从ESTABLISHED状态离开的变迁对应关闭一个连接。

4. 2MSL等待状态

       TI M E WA I T状态也称为2 M S L等待状态。每个具体T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。

       问题:为什么要存在TIME_WAIT(2MSL)状态?

       TIME_WAIT状态有两个存在的理由:

1)可靠地实现TCP全双工链接的终止

2)允许老的重复分节在网络中消逝

       第一个理由是:因为最后的ACK如果丢失的话,那么服务器一定时间内收不到ACK,将会重新发送FIN,所以客户机必须维护状态信息,以允许它重新发送最终那个ACK。要是客户机不维护状态信息,它将相应一个RST,这个分节就会被服务器解释成为一个错误。TCP需要正确处理终止序列的四个分节来执行所有必要的工作以彻底终止某个链接上两个方向的数据流。所以处于TIME_WAIT状态一端,有时必须重发最后的ACK

       第二个理由是:原来的分组可能在网络中迷途(由于路由故障,循环),这些分组被称为迷途的重复分组或漫游的重复分组。如果路由在某个时刻修复,然后ACK已经重发。那么就会收到两个ACK,如果没有2MSL状态,那么这个ACK会当做新的链接的ACK

 

        我们说图1 8 - 1 3中客户执行主动关闭并进入T I M E WA I T是正常的。服务器通常执行被动关闭,不会进入T I M E WA I T状态。这暗示如果我们终止一个客户程序,并立即重新启动这个客户程序,则这个新客户程序将不能重用相同的本地端口。这不会带来什么问题,因为客户使用本地端口,而并不关心这个端口号是什么。

       然而,对于服务器,情况就有所不同,因为服务器使用熟知端口。如果我们终止一个已

经建立连接的服务器程序,并试图立即重新启动这个服务器程序,服务器程序将不能把它的

这个熟知端口赋值给它的端点,因为那个端口是处于2 M S L连接的一部分。在重新启动服务器程序前,它需要在1 ~ 4分钟。

       下图就是一个服务器执行主动关闭带来影响的例子。

5.最大报文段长度

       最大报文段长度(Max Segment Size)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。当建立一个连接时,每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中)。如果一方不接收来自另一方的MSS值,则MSS就定为默认值5 3 6字节(这个默认值允许2 0字节的I P首部和2 0字节的T C P首部以适合5 7 6字节I P数据报)。

       例子

       考虑我们的主机s l i p,通过M T U为2 9 6的S L I P链路连接到路由器b s d i上。图1 8 - 8显示这些系统和主机s u n。

      从s u n向s l i p发起一个T C P连接,并使用t c p d u m p来观察报文段。图1 8 - 9显示这个连接的建立(省略了通告窗口大小)。

       在这个例子中, s u n发送的报文段不能超过2 5 6字节的数据,因为它收到的M S S选项值为2 5 6(第2行)。此外,由于s l i p知道它外出接口的M T U长度为2 9 6,即使s u n已经通告它的M S S为1 4 6 0,但为避免将数据分段,它不会发送超过2 5 6字节数据的报文段。系统允许发送的数据长度小于另一端的M S S值。只有当一端的主机以小于5 7 6字节的M T U直接连接到一个网络中,避免这种分段才会有效。如果两端的主机都连接到以太网上,都采用5 3 6的M S S,但中间网络采用2 9 6的M T U,也将会出现分段。使用路径上的M T U发现机制是关于这个问题的唯一方法。路径上的MTU发现机制就是运用ICMP的需要分片但是设置了不分片位(DF)的错误消息,这个错误消息返回下一站的MTU。如果所用的ICMP版本并不返回下一站的MTU的话,那么只能一个一个(设定一系列的测试值)测试了,由大到小。

你可能感兴趣的文章
剑指offer 25.二叉树中和为某一值的路径
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>