前端经典面试题网络篇之TCP三次握手、四次挥手

今天来说一说,在面试的时候,面试官经常会问到的TCP三次握手和四次挥手。上一篇给大家简单介绍了计算机网络的五层体系结构,那我们今天就来一起聊一聊传输层TCP协议的三次握手和四次挥手。

为什么要三次握手、四次挥手?

有些人可能会疑问了,TCP的三次握手跟四次挥手是什么东西?为什么要三次握手和四次挥手?

TCP协议在传输数据的时候,客户端(Client)跟服务端(Server)会建立连接,然后把需要传输的文件进行分段,以及提供可靠传输和流量控制,在数据传输完成后,当前的会话也要断开连接,避免资源浪费。其实TCP的三次握手就是建立连接的过程,而四次挥手就是断开连接的过程。

TCP三次握手

怎么去更好的理解TCP的三次握手过程, 就好比我在我女神表白。

我: "女神,我喜欢你很久了,你能听到吗?"

女神:“我能听到,我也喜欢你,你能听到吗?”

我: “我也能听到,那我们在一起吧。”

然后我就跟我女神幸福快乐的在一起了(嘻嘻.jpg)。让我们跟着这个图,来说一下每一次握手发生了什么。

image

TCP协议还有一个特点就是 面向字节流 ,它会把数据都分成一个个字节,然后进行分段传输,在分段传输的时候,每一段是由不同的字节序号组成的。

先介绍一下图中的一些字段:

SYN:同步序列号,是用来建立连接的握手信号。

ack:确认序号,当ACK为1时,ack有效,当ACK为0时,ack无效。

seq:序号。

ACK:确认序号有效。

FIN: 结束标志,用来表示断开连接。

最开始的时候,客户端和服务端都是Closed(关闭)状态,准备发送连接请求前,Server会进入LISTEN(监听)状态。

  • 第一次握手: 客户端(Client)会给服务端(Server)发送请求报文段,并指定同步序列号SYN = 1,ACK = 0, 初始序号为seq = x,(seq里面就是字节的序号),同时TCP的客户端进程进入SYN-SENT(同步已发送)状态。
  • 第二次握手: 服务端收到客户端发送的请求报文SYN后,会向客户端发送一个SYN报文作为应答,表示同意建立连接,同时指定了自己的SYN = 1, ACK = 1,还会向客户端发送seq = y,来表示自己的一个初始序号,同时也会告诉客户端下一次应该从哪开始发送的确认序号,由于客户端发送过来的初始序号seq = x, 所以确认序号ack = x + 1,这时,TCP的服务端进入SYN-RCVD(同步收到)状态。
  • 第三次握手: 客户端收到服务端的确认报文之后,会再次向服务端发送确认信息,表示已经收到。所以ACK = 1, seq = x + 1, ack = y + 1。TCP建立连接,客户端和服务器进入ESTAB-LISTEND(已建立连接状态)状态。

为什么握三次手,握两次或者四次行不行?

通过上面的三次握手,我们可以很清楚的知道,每一步握手的目的是什么。

第一次握手

客户端发送建立连接的请求报文段,服务端收到了,这样服务端能够得出客户端的发送和自己的接收是没有问题的。

第二次握手

服务端也发送一个请求报文段,表示自己收到了来自客户端的建立连接请求报文段,同时客户端也收到服务器响应的这个报文段,这样客户端能够得出服务端的发送和自己的接收是没有问题的,但是服务端并不知道客户端的接收有没有问题(只是客户端自己知道)所以还需要第三次握手来告知服务端。

第三次握手

客户端接着发送请求报文段,表示自己收到了服务端的确认信息,然后服务端也正常收到了。自此,握手结束,可以知道双方的发送和接收是正常的。

假如只握手了前两次,会造成什么样的后果呢?客户端第一次向服务端发送了建立连接的请求报文段,有可能因为网络的原因滞留了,客户端就会认为这个请求失效了,会重新向服务端发送一个连接请求,然后服务器正常响应连接。在某个时间段,第一次发送的连接请求才到达了服务端,如果没有第三次握手确认,那么此时服务端会误认为客户端又发了一个新的连接请求,会再一次响应客户端,客户端收到响应请求,发现这个请求刚刚已经发过了,而且也收到了服务端的响应,就忽略这个请求,但此时的服务端却还一直等待客户端的响应,这样就会造成资源的浪费。

假如握手了四次,又会是什么样子呢?第三次握手,服务端最后一次收到客户端的响应请求之后,如果此时进行第四次握手的话,那么应该是服务端接着去响应刚刚收到的这个请求,这个请求不管失败还是成功,意义都不大。因为三次握手之后,客户端和服务端都已经知道了双方的发送和接收是正常的,是可以进行数据传输的,就不需要再次发送确认请求了,而且完全可靠的通信协议也是不存在的。

TCP四次挥手

再给大家举一个例子。A和B是一对情侣,一天,A对B说

A:“咱们分手吧。”

B(震惊):“嗯。”

...沉默ing...

B:"那就分手吧。"

A: "嗯。"

然后A和B就分开了。同理,TCP断开连接,也要经历四次挥手的过程。

image
  • 第一次挥手: 客户端主动断开连接,向服务端发送FIN报文段,即连接释放报文段(FIN=1,序号seq=u),并且状态变为FIN-WAIT-1(终止等待1)。
  • 第二次挥手: 服务端收到客户端的FIN报文段,响应请求,也向客户端发送一个ACK = 1,seq = y, ack = u + 1(三次握手阶段已经解释过seq和ack,没看懂的可以重新看一遍) 的报文段,来表示自己已经收到了客户端的断开连接的请求报文,同时将自己的状态变为CLOSE-WAIT(关闭等待)。

客户端收到第二次的挥手报文之后,也会将自身的状态变为FIN-WAIT-2(关闭等待),此时客户端已经断开了对服务端的连接,也就是说,客户端不能再向服务端发送数据了,但是服务端并没有断开连接,它仍然要向客户端发送未发送完的数据,即TCP处于半关闭状态,这也是为什么要四次挥手的原因。

  • 第三次挥手: 等待一段时间,当服务端将剩余数据发送完后,也会向客户端发送一个FIN = 1 的报文段,其中seq = w, ack = u + 1, ACK = 1,同时,自身进入LAST-ACK(最后确认)状态,来等待客户端的ACK。
  • 第四次挥手: 客户端收到服务端的断开释放报文段FIN,同样对它进行响应,向服务段发送ACK = 1 ,seq = u + 1, ack = w + 1的报文段,并且自身进入TIME-WAIT状态,一段时间过后,服务端收到客户端的响应报文,将自身状态变为Closed,客户端等待TIME-WAIT时间过后,也将变为Closed状态。四次挥手完毕,客户端和服务端断开连接。

为什么最后一次挥手,客户端还要进入一个TIME-WAIT状态?

如果客户端最后一次挥手发送的确认请求报文,服务端没有收到的话,服务端就会认为,是因为它自己发送的FIN报文段没有发送出去,导致客户端没有收到,客户端没有收到,就不会给它发送确认请求报文,于是,服务器会再次发送FIN报文段,所以有一个时长为2MSL的等待时间。

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