TCP初探(一)

什么是 TCP 协议?

TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  • 什么叫做面向连接?

面向连接是指,正式通信前必须要与对方建立连接。事先为所要发送的数据开辟出一条连接好的通道。TCP 连接又包括连接建立和连接终止两个环节,建立连接需要三次握手,而终止连接需要四次握手。

下文会详细讲述什么是三次握手。在这之前,先来研究一下 TCP 协议传输的报文的格式。

报文格式

报文格式

重要字段讲解:

  1. TCP 序列号(序列码 SN, Sequence Number):四个字节,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。

  2. TCP 应答号( Acknowledgment Number 简称 ACK Number 或简称为 ACK Field ):四字节,只有 ACK 标志位为 1 时,确认序号字段才有效,Ack=Seq+1。

  3. 标志位共6个:即 URG、ACK、PSH、RST、SYN、FIN 等

    (1)URG:该标志位置位表示紧急( The urgent pointer ) 标志有效。

    (2)ACK:该标志位取值 1 代表 Acknowledgment Number 字段有效,这是一个确认的 TCP 包,取值 0 则不是确认包。当 TCP 包有效时,称为 ACK 包。

    (3)PSH:表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。

    (4)RST:用于复位相应的 TCP 连接。通常在发生异常或者错误的时候会触发复位 TCP 连接。

    (5)SYN:起了一个新的连接。该标志仅在三次握手建立 TCP 连接时有效。当这个 SYN 标志位有效的时候称呼这个包为 SYN 包。

    (6)FIN:释放一个连接。当 FIN 标志有效的时候称呼这个包为 FIN 包。

三次握手

三次握手过程

三次握手是指建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立。

三次握手
  1. 第一次握手:Client 发送标志位 SYN = 1, 随机产生序列号 seq = J 的数据包到 Server。Server 由 SYN = 1 知道 Client 想建立连接。同时 Client 进入 SYN_SENT 状态。

  2. 第二次握手:Server 确认连接,向 Client 发送 标志位 SYN = 1, ACK = 1,确认号 ack number = seq +1 = J+1, 随机产生序列号 seq = k 的数据包。同时 Server 进入 SYN_RCVD 状态。

  3. 第三次握手:Client 收到数据包后检查 ack number 是否正确(ack number 是否等于第一次发送的 seq + 1,并且标志位 ACK = 1),若正确,Client 发送标志位 ACK = 1, 并且确认号 ack number = server的seq +1 = K + 1的数据包给 Server。Server 收到后检查 ack number 与 标志位 ACK = 1 则表示连接成功。同时 Client 和 Server 进入 ESTABLISHED 状态,完成三次握手。

为什么是三次握手,不是两次握手?

两次握手的情况,当 Client 发送第一个连接请求由于网络原因长时间滞留,延误到 Client 连接释放以后的某个时间点才到达 Server。该报文本来应该失效了,Server 收到失效的报文,因为是两次握手,Server 发出确认报文后直接建立了连接。这时候 Client 根本没有发出连接请求,也不予理睬 Server 的报文,也不给 Server 发送数据,Server 却以为连接已经建立了,白白的一直在等待 Client 发送数据,耗费资源。

所以,三次握手是建立起可靠的传输信道的最小值。

TCP 协议最常受到的攻击

TCP 协议的设计,会受到哪些攻击呢?

首先理解几个重要概念:未连接队列,SYN-ACK 重传次数和半连接存活时间。

  1. 未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的 SYN 包开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 SYN_RCVD 状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED 状态。

  2. SYN-ACK 重传次数 服务器发送完 SYN-ACK 包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

  3. 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到 SYN 包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为 Timeout 时间、SYN_RCVD 存活时间。

  • SYN 攻击原理

由于 TCP 协议的设计,最常见的攻击就是 SYN 攻击。SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。大量发送伪造源 IP 的 SYN 包也就是伪造第一次握手数据包,服务器收到 SYN 包后,会发送 SYN-ACK 数据包,由于源 IP 是伪造的,所以服务器不会收到 ACK 数据包,并会不断的进行重发。同时,服务器每接收到一个 SYN 包就会为这个连接信息分配核心内存并放入半连接队列,如果短时间内接收到的 SYN 太多,半连接队列就会溢出,操作系统会把这个连接信息丢弃造成不能连接,当攻击的 SYN 包超过半连接队列的最大值时,正常的客户发送 SYN 数据包请求连接就会被服务器丢弃。目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

  • 如何检测与预防 SYN 攻击

针对 SYN 攻击的几个环节,可以有相应的处理方法:

  1. 减少 SYN-ACK 数据包的重发次数(默认是 5 次),避免不断的重发 SYN-ACK 数据包,耗费系统资源。

  2. 使用 SYN Cookie 技术

    • 原理

    SYN Cookie是对 TCP 服务器端的三次握手做一些修改,专门用来防范 SYN 攻击的一种手段。它的原理是,服务器接收到 SYN 包并返回 SYN-ACK 包时,不分配一个专门的数据区,而是根据 SYN 包计算一个 cookie 值。这个 cookie 作为 SYN-ACK 包的 Seq Number。当客户端返回 ACK 包时,根据包头信息计算 cookie,与返回的 Ack Number(Seq Number + 1)进行对比,如果相同,则是一个正常的连接,然后分配资源,建立连接。

    • Cookie 如何计算

    Cookie的计算利用了 Seq Number,长度 32 bit,分为 3 段。如下图:

Cookie值
第一段:5bit 表示时间 t,t 的值是系统时间除以64再对32取余数(time()>>6 mod 32),最高表示到 31。

第二段:3bit 表示 TCP 中最大分段的大小(Maximum segment size),表示最大分段大小的数量只有 8 种,所以服务器在启用了 SYN Cookie 时只能发送八种不同的数值。

第三段:24bit 表示一个由加密散列函数计算得到的值 mac = MAC(A, k),其中 MAC 为带有密钥的散列函数,在 linux 中是 sha1,A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND,其中 t 就是上面说的时间,而 MSSIND 是上面说的最大分段大小。k 是服务器提供的密钥。
  1. 增加半连接队列(默认是 1024)

  2. 限制 SYN 并发数

未完待续……

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

推荐阅读更多精彩内容