(012)TCP/IP协议-TCP建立与终止连接

一、引言

TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。连接创建与终止的状态变化图如下:


图1.tcp建立连接与终止连接状态转换图

二、三次握手建立连接

图2.tcp建立连接三次握手

过程如下:

  • 客户端发送一个SYN数据包指明客户端打算连接服务器的端口,初始化序号(ISN)为m。
  • 服务器发回包含服务器的ISN作为应答(值为n)。同时,将确认序号设置成客户端ISN+1(m+1)来作为对客户端SYN的确认。
  • 客户端发送一个ACK数据包,ack=n+1,作为对服务器的SYN的确认。

1.为什么是三次握手,而不是两次

网络是不可靠的,数据包是可能丢失的。假设没有第三次确认,客户端向服务端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。回忆一下介绍 TCP 首部时提到的序列号,这两个包的序列号显然是相同的。假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。
  TCP是双通道,需要双向确定。只有两次握手,客户端知道了服务器收到了,服务器不知道客户端收到了,联想打电话。通讯系统中的占拜庭将军问题。

2.最大报文段长度

最大报文段长度(MSS)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。在三次握手的时候SYN的TCP首部中的可选字段确定。以太网的默认长度为1460。

3.

三、四次握手关闭连接(正常状态)

建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。


图3.四次握手关闭连接
  • 主动方想要关闭连接,发送FIN包给被动方,序号为m
  • 被动方接收到主动方发送的FIN包,知道了对方要关闭连接,发送ACK确认包,序号m+1。主动方连接关闭。
  • 等待片刻(处于半关闭状态),在此期间(fin_wait2,close_wait)。被动方发送最后的数据,主动方接收最后的数据。
  • 被动方确认要关闭连接,发送FIN包。序号n。
  • 主动方等待片刻(接收网络中,还未到达的数据包),发送ACK确认包。序号n+1。到此连接关闭。

1.TCP的半关闭状态

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。如主动方处于fin_wait2状态。

2.TIME_WAIT状态

TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL( Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。在实际应用中,对 I P数据报TTL的限制是基于跳数,而不是定时器。
  在处于2MSL等待状态的socket(客户端IP与端口,服务器IP与端口)不能再被使用。但在实际的使用中,允许一个新的连接请求到达仍处于time_wait状态的连接,只要新的序号大于该连接的前一个连接的最后序号。

四、正常状态抓包

下面是一次完整的tcp建立连接,发送数据,关闭连接过程


图4.tcp一次完整请求

该过程为,3次握手建立连接,一次数据发送,4次握手关闭连接

五、异常情况

出现异常的时候,服务器通常通过复位报文来通告,复位报文为tcp数据包类型设置为rst。

1.连接超时或到达不存在的端口/服务器

当服务器端没有开或网络问题,会出现连接超时的情况。抓包如下:


图5.连接超时

客户端尝试3三次来连接,有时候服务器端会发送rst数据包。

2.异常终止一个连接

在TCP通讯中。如果通讯双方应为某种原因(如突然断电等)关闭连接时候一方(如A)没有发送fin数据包。另一端(如B)不知道对方已经关闭了连接。再次发送数据的时候,异常关闭的一方,可能会返回一个rst数据包。通知异常关闭。如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开(Half Open)的。

3.同时打开

两个应用程序同时彼此执行主动打开的情况是可能的。每一方必须发送一个SYN,且这些SYN必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。同时打开的状态迁移图不同于正常状态的三次握手,该情况下需要进行4次握手。如图:


图6.同时打开,4次握手建立连接

4.同时关闭

我们在以前讨论过一方(通常但不总是客户方)发送第一个FIN执行主动关闭。双方都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close)。在同时关闭的时候,双方都进入time_wait状态,如图:


图7.TCP同时关闭连接状态转换图

六.TCP服务器设计

大多数的TCP服务器进程是并发的。当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。

1. 接入连接请求队列

一个并发服务器调用一个新的进程来处理每个客户请求,因此处于被动连接请求的服务器应该始终准备处理下一个呼入的连接请求。那正是使用并发服务器的根本原因。但仍有可能出现当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。当服务器正处于忙时,TCP是如何处理这些呼入的连接请求?TCP有这样一个队列来临时存放这些连接-接入连接请求队列。处理方式如下:

  • 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被TCP接受(即三次握手已经完成),但还没有被应用层所接受。注意区分TCP接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列中移出。
  • 应用层将指明该队列的最大长度,这个值通常称为积压值 (backlog)。
  • 当一个连接请求(SYN)到达时, TCP使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。积压值说明的是TCP监听的端口已被TCP接受而等待应用层接受的最大连接数。
  • 如果对于新的连接请求,该TCP监听的端口的连接队列中还有空间,TCP模块将对SYN进行确认并完成连接的建立。此时,应用层不一定知道该新的连接,如果对方发送数据,这些数据将放入缓冲队列中。
  • 如果对于新的连接请求,连接队列中已没有空间,TCP将不理会收到的SYN。也不发回任何报文段(即不发回 RST)。如果应用层不能及时接受已被TCP接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时。

都看到这里了,要不要扫二维码关注一下微信公众号林湾村龙猫

微信公众号rudy_tan_home

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容