TCP(I) 连接管理

TCP 连接管理

查看原文

TCP 连接的建立和终止

一个 TCP 连接由一个四元组构成:源 IP、源端口、目的 IP、目的端口。一个连接通常分为三个阶段:启动、数据传输(也称“连接已建立”)、关闭。以下是建立连接是三步握手和关闭时四步挥手的过程。

image
握手:
  • 客户端先发一个 SYN(synchronous)报文段,并指明客户端的初始序列号(Initial Sequence Number),图中值为 ISN(c)。(注意这里可能出现超时或报文丢失的情况)
  • 服务端收到后返回一个 ACK(acknowledgement),并指明ACK确认号的值为 ISN(c) + 1 来表明已经收到 Seq 值为 ISN(c)的SYN报文段。服务端在同一个报文段还发送了一个SYN并指明自己的初始序列号ISN(s).
  • 客户端收到 ACK+SYN,发送 ACK 向服务端确认收到来自服务端的 SYN ,并指明 Seq=ISN(s) + 1.

重要的细节:对于 client 来说,第三步似乎是多余的,但是对服务端来说,是一个防止 SYN 泛洪攻击的手段:服务端在建立连接后需要为该连接分配变量和内存,如果没有第三步,恶意客户端通过不停伪造 IP 和端口发起 SYN(客户端没有太大内存消耗),导致服务端不停分配变量,最后内存消耗完崩溃。所以第三步可以让服务端辨别恶意客户端。

挥手:
  • 关闭发起者(TCP 连接是双向的,任何一方都可以主动断开连接)向另一方发送一个 FIN(final)段表示要开始关闭连接。此时的 ACK 值是确认最近一次发来的数据。
  • 被动方接收 FIN,发回一个 ACK。
  • 被动方向发起方发送一个 FIN,同时再次确认之前的 FIN,ACK 和上次相同。
  • 发起方收到 FIN,发回 ACK

挥手断开这里同样有很多重要细节:

  • 前两步完成后,发起方到被动方的连接已经关闭,但 TCP 是双向的,此时由于被动方还没有发送FIN,所以被动方到发起方的连接还打开着,TCP 连接目前处于半关闭状态,此时被动方仍然可以向发起方发送数据,发起方也可以正常接受数据。但是如果被动方既不再发送数据,也不发送最后的 FIN,就会出现问题。所以发起方收到 FIN 的 ACK 时,设置了一个定时器,在规定时间内没有数据发过来,就自动断开连接。
  • 另一个问题是,如果发起方发送了最后一个 ACK 用于确认被动方的 FIN 之后立刻关闭,但是此 ACK 超时未达或者丢失了,就会造成问题—被动方的 FIN 得不到确认。这时被动方会在超时后重新发送 FIN,直到收到 ACK 为止。所以发起方发送完最后一个 ACK 后不能马上离开,而要等一段时间,用于确保对方收到 ACK,这段时间叫静默时间,并且这个时间是强制的。静默时间大小一般为2*MSL(Max Segment Lifetime,报文段在被丢弃前允许的最长存活时间)所以它还有另一个重要的作用,就是让属于这个已经关闭连接的报文段过期,以免相同的客户端和服务端再次建立连接时受到之前已经关闭连接的影响。

TCP FSM

以下是 TCP 三步握手和四步挥手的有限状态机。应该掌握。

image

TCP 选项

TCP 有若干选项,每个选项的头一个字节表示“种类”,指明了选项的类型。

MSS 最大段大小选项

Max segment size。当一条 TCP 连接建立时,通信双方都要在 SYN 报文段的 MSS 选项说明自己允许的最大段大小。注意最大段大小不是双方协商的结果,而是表明自己不愿意接收任何大于该尺寸的报文段。

SACK 选择确认段

Select ACK。在滑动窗口中,TCP 采用累计 ACK 确认,不能正确的确认已经收到的但是是失序的报文段,接收方的数据队列就会出现空洞。SACK 能够使发送方了解到空洞出现并进行更有效的重传工作。通过接收 SYN 报文段中的“允许确认选项”,TCP 通信方会知道自身拥有了发布 SACK 的能力。SACK 选项由 n 个 SACK 块构成,每个 SACK 块是一对32位的序列号(a,b),表明已经接受 a 到 b 的数据。

WSOPT

Window scale option。窗口本来大小只有16位,若 wsopt 值为 s,则窗口大小为16*2^s,最大值为 1G

TSOPT

timestamp option。发送方发出的报文段带有发出时的时间戳,接收方收到后将该值写入 ACK 报文段发回给发送方。发送方据此可以精确地计算 RTT(round trip time)。同时该选项还可用于防回绕:假如存在一个过期了的报文段恰好和下一次要接受的报文段序列号相同,这时候可以通过时间戳来判断,如果该报文时间戳小于最近一次收到的报文段,说明改报文段是过期了的。

TCP 服务器选项

TCP 服务端会为每一个客户端分配一个新的进程或线程,这样负责监听的服务器就能始终准备着处理下一个到来的连接请求。但是如果服务器正在创建一个新进程(线程)时有更多的连接到来,应该如何处理?

在被用于应用程序之前,新的连接可能会有两种状态:

  • SYN_RCVD 状态

  • ESTABLISHED 状态 但未被应用程序所接受。

TCP 为这两种状态的连接准备了两个队列,可以通过限制它们的大小来管理连接。

  • 当一个 SYN 报文段到达,将会检查 SYN_RCVD 队列是否已满(Linux 中默认为1000),未满则加入队列,否则拒绝连接。
  • ESTABLISHED 状态的队列通常被称为未完成连接(backlog,虽然叫未完成,但是三次握手已经完成,只是还没被应用程序处理),backlog 队列最大长度默认为128
  • 如果 backlog 队列未满,则会根据 SYN_RCVD 队列应答 SYN 并完成握手,握手完成后,加入 backlog 队列,由负责监听的服务器依次分配线程。注意当客户端发送 ACK 后,会认为服务端已经做好接收数据的准备来,所以会立即发送数据,但此时连接可能还处于 backlog 队列,还未被应用程序处理,所以 TCP 还有一个专门的数据队列。
  • 如果 backlog 已满,则会延迟应答 SYN。正常的 TCP 机制里,客户端会等待 SYN 超时,但在 Linux 客户端中,既不超时也不重置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 3,271评论 0 13
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,208评论 0 11
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 12,985评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,020评论 0 8
  • 传输层-TCP, TCP头部结构 ,TCP序列号和确认号详解 TCP主要解决下面的三个问题 1.数据的可靠传输...
    抓兔子的猫阅读 4,405评论 1 46