TCP连接建立与终止

TCP连接建立与终止

(本文为读书笔记,代码图片均来自APUE)

一、TCP连接

当一端为建立连接而发送他的SYN时,他为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作32比特的计数器,每4ms加1.这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对他作错误的解释。在多数的伯克利实现版中,系统初始化时初始的发送序号被初始化为1.这个变量每0.5秒增加64000,并每个9.5小时又回到0.另外,每次建立一个连接后,这个变量将增加64000.

三次握手四次挥手

由于TCP连接是全双工的,所以每个方向都必须单独地进行一次关闭。当一方完成了数据发送任务后就能发送一个FIN信号来终止这个方向上的连接。当另一端收到这个FIN信号,他需要通知应用层另一端制止了那个方向的数据传输。而收到一个FIN信号以为着对方没有数据传输了,但是本端仍能够进行数据发送。

二、2MSL状态

TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL。他是任何报文段被丢弃前在网络内的最长时间。RFC793指出MSL为2分钟。。然而实现中常用的值是30秒,1分钟或2分钟。TCP连接在2MSL等待期间,定义这个连接的插口不能再被使用。这个连接只能在2MSL结束后才能再被使用。

三、TCP同时打开与关闭

两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个 S Y N,且这些S Y N必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开。

同时打开

双方都执行主动关闭也是可能的,T C P协议也允许这样的同时关闭。

同时关闭

四、呼入连接请求队列

当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。当服务器正处于忙时, T C P是如何处理这些呼入的连接请求?

在伯克利的T C P实现中采用以下规则:
1) 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被 T C P接受(即三次握手已经完成),但还没有被应用层所接受。注意区分T C P接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列
中移出。
2) 应用层将指明该队列的最大长度,这个值通常称为积压值 ( b a c k l o g )。它的取值范围是0 ~ 5之间的整数,包括0和5(大多数的应用程序都将这个值说明为 5)。
3) 当一个连接请求(即S Y N)到达时,T C P使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。我们期望应用层说明的积压值为这一端点所能允许接受连接的最大数目,但情况不是那么简单。。
注意,积压值说明的是 T C P监听的端点已被T C P接受而等待应用层接受的最大连接数。这个积压值对系统所允许的最大连接数,或者并发服务器所能并发处理的客户数,并无影响。
4) 如果对于新的连接请求,该 T C P监听的端点的连接队列中还有空间,T C P模块将对S Y N进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接时。另外,当客户进程的主动打开成功但服务器的应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了(如果发生这种情况,服务器的 T C P仅将接收的数据放入缓冲队列 )。
5) 如果对于新的连接请求,连接队列中已没有空间, T C P将不理会收到的 S Y N。也不发回任何报文段(即不发回 R S T)。如果应用层不能及时接受已被 T C P接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时。

 




So BadJust So SoGoodCoolPretty Cool (1 人已评分, 平均分: 4.00 )
Loading...

发表评论

电子邮件地址不会被公开。 必填项已用*标注