理论经典:TCP协议的3次握手与4次挥手过程详解

先来认识一 TCP 报文格式:

上图中的中的字段说明:

  • 序号:seq 序号,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记
  • 确认序号:ack 序号,占 32 位,只有 ACK 标志位为 1 时,确认序号字段才有效,ack = seq + 1
  • 标志位:供 6 个,即 URG、ACK、PSH、RST、SYN、FIN 等,具体含义如下
    • URG:紧急指针有效
    • ACK:确认序号有效
    • PSH:接收方应该尽快将这个报文交给应用层
    • RST:重置连接
    • SYN:发起一个新连接
    • FIN:释放一个连接

需要注意的是:

  • 不要将确认序号 ack 与标志位中的 ACK 搞混了,
  • 确认方 ack = 发起方 req + 1,两端配对

3 次握手过程详解

        所谓三次握手,即建立 TCP 连接,就是指建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立。在 socket 编程中,这一过程由客户端执行 connect 来触发,整个流程如下图所示:


第一次握手
        client 将标志位 SYN 置 1,随机产生一个值 seq = J,并将该数据包发送给 server,client 进入 SYN_SENT 状态,等待 server 确认
第二次握手
        server 收到数据包后由标志位 SYN = 1 知道 client 请求建立连接,server 将标志位 SYN 和 ACK 置 1,ack = J + 1,随机产生一个 seq = K,并将该数据包发送给 client 以确认连接请求,server 进入 SYN_RCVD 状态
第三次握手
        client 收到确认后,检查 ack 是否为 J + 1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack = K + 1,并将该数据包发送给 server,server 检查 ack 是否为 K + 1,ACK 是否为 1,如果正确则连接建立成功,client 和 server 进入 ESTABLISHED 状态,完成三次握手,随后 client 与 server 之间可以开始传输数据了
SYN 攻击
        在三次握手过程中,server 发送 SYN_ACK 之后,收到 client 的 ACK 之前的 TCP 连接称为半连接,此时 server 处于 SYN_RCVD 状态,当收到 ACK 后,server 转入 ESTABLISHED 状态,SYN
攻击就是 client 在短时间内伪造大量不存在的 IP 地址,并向 server 不断的发送 SYN 包,server 回复确认包,并等待 client 的确认,由于源地址是不存在的,因此,server 需要不断重发甚至超时,这些伪造的 SYN 包将长时间占用未连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪,SYN 攻击时一种典型的 DDOS 攻击,检测 SYN 攻击的方式非常简单,即当 server 上有大量半连接状态且源 IP 地址是随机的,则可以断定遭到 SYN 攻击了,使用如下命令可以让之现行:

netstat -nap | grep SYN_RECV

4 次挥手过程详解

        四次挥手,即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开。在 socket 编程中,这一过程由客户端或服务端任一方执行 close 来触发,整个流程如下图所示:


        由于 TCP 连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN,首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即
第一次挥手
        client 发送一个FIN,用来关闭 client 到
server 的数据传送,client 进入 FIN_WAIT_1 状态。
第二次挥手
        server 收到 FIN 后,发送一个 ACK 给 client,确认序号为收到序号 + 1(与SYN相同,一个 FIN 占用一个序号),server 进入CLOSE_WAIT 状态,
第三次挥手
        server 发送一个 FIN,用来关闭 server 到 client 的数据传送,server 进入 LAST_ACK 状态。
第四次挥手
        client 收到 FIN 后,client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 server,确认序号为收到序号 + 1,server 进入 CLOSED 状态,完成四次挥手

结束语

  • 三次握手是什么或者流程?四次握手呢?
  • 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

        这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端,而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即 close,也可以发送一些数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送

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

推荐阅读更多精彩内容