‹  返回课程

RST…… 下面呢?

课文
阅读量:353
技术范畴
通过学习TCP连接建立与断开的过程,了解TCP“谨慎”的一面,而后学习为什么它还有很不“谨慎”的RST指令。
课前导言
如果能通过本文记住以下TCP指令:SYN、ACK、FIN、RST的含义,嗯,这节课就有收获了。
RST…… 下面呢?
RST是什么?为什么有笑话说它没有下面?

有一个用于批判腐朽封建制度对皇家服务生血淋淋之生理摧残的老段子,是这样的:

一天有个太监对慈禧太后说笑话:“从前有个太监。”

(双方都不说话)

慈禧:“下面呢?”

太监:“没了。”

有一个用于赞扬某专用网络设备的技术之先进性与实用性的老段子,是这样的:

ABCDEFGHIJKLMNOPQRST

咦?“RST”的下面呢?也没了。

这一次我们的学习,就从这里开始。

当我们上网浏览网页, 看视频、下载文件等,我们的电脑(称为“客户端”)和互联网上的某台电脑(称为“服务器”)之间,需要建立一条网络连接。连接有不同类型,TCP(传输控制协议/Transmission Control Protocol)是最常见的,相对可靠的连接。

这里的“可靠”要怎么理解?就像“安全的”被区分为“safe”和“secure”一样,当我们说到“可靠”时,通常也区分两种意思。请大家按以下语境理解:

  1. 娇滴滴的女人对山本龙太郎说:“亲爱的,我给你介绍的小弟,最可靠啦!”山本龙太郎嘴上没说,心里却想:“胡扯,就你这个女人给我介绍的人最不可靠!”——这里的可靠主要指的是忠诚度高,不容易被外人利用。
  2. 山本龙太郎对为他服务的女人说:“你的技术可靠吗?”女人说:“当然可靠啦,您看,我们先对您的耳朵消毒,用的设备声光效果齐全,是一套集大数据、人工智能、深度学习之大成的采耳设备。而且我拥有美国认证的八级采耳证,持证上岗,绝非临时工,有什么不可靠呢?”——这里可靠主要指技能水平比较高,不容易出错。

TCP连接的“忠诚度”并不高,不引入其它手段(比如TLS/SSL)的话很容易因外部入侵而篡改;所以TCP自称的“可靠”,主要是指它在日常业务上,会小心行事,尽量在工作上(收发数据等)不出错。这一点,可以从它建立连接和断开连接的谨慎程度,一窥全豹。

1. TCP连接建立——三路握手的谨慎

要了解TCP如何小心翼翼地建立连接,先来学习两个术语:

  • SYN: 同步序列编号(Synchronize Sequence Numbers)。只在建立连接时有用。当客户端(也就是我们的电脑)想和服务端建立连接时,需要发有这个标记的指令。你可以理解为,客户端向服务端呼叫:“喂!我是100号,我是100号,请求连接!请求连接!”;
  • ACK:确认标记(Acknowledgement Number)。服务端在收到请求时,通常需要回复一个确认标志,类似于:“我是服务端,收到!收到!我是300号”;

人类在电话接通时,都会先“喂,喂”几声。为的是什么?也是为了“可靠性”,确保对方身份没错,并且已经在听你讲话。TCP的连接由客户端发起,整个过程其实很简单,很好理解,根本不需要画图,请往下看:

  1. 客户端向服务端发送 SYN 指令:“喂!我是100号,请求连接!”;
  2. 服务端收到后,回复 ACK + SYN:“知道啦!” + “我是300号!”;
  3. 客户端收到后,再回复ACK:“我也知道啦!”。

就这样。如果还不理解,请以大伟向安红求爱为例:

  1. 大伟:“你爱我吗?”
  2. 安红:“我爱你 ,你爱我吗?”
  3. 大伟:“我也爱你”。

这三步一结束,双方就相当于结婚取证了。这三步常被称为“三次握手协议”(严格翻译应该是“三路握手协议/Three-way Handshake”)。是客户端和服务端的结婚三步曲。

肯定有人要问了:“说三句话就结婚,是不是太草率了?”。不对哦,在网络的世界里,如此三次传输才开始真正的通信,已经非常的严肃,并且代价巨大(请自行了解TCP建立连接的性能代价)。作为对比,有一种UDP协议,它只需在网络里大叫一声:“安红,我爱你!”,然后大伟就可以喋喋不休地冲人家安红说话了。

2.TCP连接断开——四路握手的谨慎

在一起要谨慎,分手更要谨慎。TCP连接的断开,需要四路握手。

想断开的一方,可以是客户端,也可以是服务端,为了方便,我们仍然以客户端为例,也就是上面的“大伟”来当这个负心人。

  1. 大伟:“我想分手。”
  2. 安红:“好的。”(不过可以等我一会儿吗?)
  3. 安红:“我也想分手了。”
  4. 大伟:“好的。”

两人这就相当去完民政局办好了离婚。唯一还有疑惑的,可能就是被分手后一方听到分手消息时,为什么需要让对方等一阵呢?这是因为被提出分手一方,通常需要一点时间来处理手上连接上的数据。比如,也许大伟在提分手前100毫秒,通过连接给安红发送一朵玫瑰,女方也许希望收下这朵最后的玫瑰,哪怕是闻一下它的香味,再结束这段感情吧?也有可能,是女方在收到断开指令时,正打包了一条围脖,心想还是发送过去让他收到吧,毕竟天冷,他还需要……于是她先回复了男方“知道了”,然后还是发出数据,再追加一句“分手吧”……

不管怎样,都挺凄美的啊!

“我想分手”的指令,是FIN,即 finish 的缩写。以上过程用指令表达,就是:

  1. 主动断开方:FIN;
  2. 被动断开方:ACK;
  3. 被动断开方:FIN;
  4. 主动断开方:ACK。

3. SYN、ACK、FIN——关RST什么事?

对哦,这个笑话说半天,我们懂了SYN、ACK和FIN,但是,关笑话的主题RST什么事?

以上我们用连接的建立和断开,来说明TCP连接做事其实还是挺谨慎的。中间没有说的一件TCP连接最主要的事,是连接两端之间的数据发送与接收。这个当成作业留给大家上网搜索、学习。你会发现,TCP连接的数据收发,也是挺谨慎的。比如,每个数据包同样要有前面提到“SYN”(同步序列编号/Synchronize Sequence Numbers),同样要有确认“ACK”数据包,还有超时重传等等等等……

但是!TCP连接也有非常干脆利落,绝情冷漠的时刻,在这类时刻,某一端会直接发一个RST指令,然后就立马断开连接,转身而去……

RST:reset,重置指令

3.1 第一种情况:请求建立不存在的服务项连接

要理解这种情况,得先说一个事实:客户端与服务端之间是多对一的关系……

“什么!”

讨论群一下子炸锅了。这服务端(假设是女方),也太滥情了吧,居然一对多?

冷静。最前面我们说,本文描述的服务端和客户端,都是指电脑。一台电脑提供多个服务,很正常的事嘛。比如一台电脑既提供网页浏览服务、也提供文件下载服务、还提供收发电子邮件的任务。同一台电脑对外的地址,通常只有一个,为了在同一个地址上区分出不同服务,通常会为每种服务分配一个编号 ,称为“端口”号。

假设现在有台电脑,只提供80端口和27端口的服务,来了一个客户端发来SYN指令,但申请的却是250端口的服务……服务端电脑就会直接回一个“RST”,然后再不理会这个无理的连接请求。大家可以把服务端理解成一台水机,同一台水机有两个出水龙头,一个提供热水服务,一个提供冷水服务;但来了一个人,说:我想要一杯可口可乐……水机如果会说话,就会说一句:“RST”,大概就是“滚”的含义吧……

实际上在同一个端口,客户端和服务端之间,也是多对一的关系。这是网络连接方面的基础知识,但不在这篇文章的讨论范围内了。

3.2 第二种情况:请求超时

一方发出请求,需要对方回复确认时,超时未收到,哪怕重试多次后,还是收不到,此时等得不耐烦的一方,也会发出RST。男生们只要想想约会时如果你迟到1小时,女方是不是会简单地甩你一句“分手”?这就是“RST”

3.3 第三种情况:受到攻击

正如前面所说TCP的可靠性并不是指“忠诚度”。攻击者很容易人工组装(伪造)相关TCP报文。

攻击者可以伪造RST报文,来“逼疯”另一方;也可以是M和N聊得好好的,来了个第三者K欺骗M说我才是你的N,于是M就有可能对真正的N来一个“RST”。

3.4 第四种情况:向已关闭的一方,继续发送数据

有一方,比如是女方吧,提出分手。另一方,也就是男方不回复ACK,或者回复了ACK,但还一个劲儿发数据。此时对方给你一个“RST”,妥妥的。

3.5 第五种情况:GFW

有一种高科技设备,可以在某些情况下,出于保护网络客户端的一片爱心,而将服务方返回“ACK”修改成“RST”。

4. 只是笑话

SYN、ACK、FIN、RST等,它们在TCP报文中的表达方法,是在某个数字某个位是0或是1,都不是真的由三个字母组成的字符串;所以,笑话也就只是笑话,在技术上并不成立,不可能因为你发送这样一串字符包含有RST字样,造成连接中断。

ABCDEFGHIJKLMNOPQRSTUVWXYZ

你不会因为发送RST三个字母面被中断网络连接……至于发送GFW,大家也别担心,我亲身试过了,在网上搜索这三个字母,也不会被中断网络连接。 如果你不懂GFW是什么,现在是时候搜索一下它了。

课后导言
我们学了哪几个TCP指令?