靠谱的TCP:三次握手和四次挥手

来源:互联网 发布:node 压力测试 编辑:程序博客网 时间:2024/04/29 19:56

友情提示:如果你对技术不感兴趣,请直接跳到最后:分割线以后。


昨天和大家聊了聊CDN,顺便扯出了两个观点:

第一,物理上接近你的目标,你才能更有可能成功。

第二,做一个靠谱的伙伴,让别人对你放心。


如果大家感觉陌生或者好奇CDN和这两个点有什么关系,那么请移步:CDN知道为什么是你?


今天我们继续说网络请求。现在是万事俱备只欠东风。这个东风是什么呢?就是TCP链接。什么是TCP?

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。


上面一段话总结成一句:TCP是靠谱的通信协议。


为什么说TCP是靠谱的呢?这是相对与UDP来说的,UDP的工作原理特别像一句话:有人生没人养。也就是报文发出去了,UDP就不管了,至于你到达没到达它都不管。再扯远一点,就像有些人自己写完项目,直接甩手给别人,自己不维护,不对质量负责。工作中这种人最讨人厌了。自己挖了一个一个的坑,需要别人一个一个填平。


下面就说说这个靠谱的通信协议。TCP是怎么保证靠谱的呢?这就是“三次握手协议”。


三次握手协议指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互。


第一步:客户端发送SYN(SEQ=J)报文给服务器端,客户端进入SYN_SEND状态。


第二步:服务器端收到SYN报文,回应一个SYN (SEQ=K)ACK(ACK=J+1)报文,进入SYN_RECV状态。


第三步:客户端收到服务器端的SYN报文,回应一个ACK(ACK=K+1)报文,进入Established状态。


三次握手完成,TCP客户端和服务器端成功地建立连接,可以愉快的传输数据了。


用一个例子给大家解释一下上面那三个步骤:


假如你我是同事,我要给你传送一分文件。那么我应该执行以下三步。

第一步:我要确认你在不在工位(不要说,看一样不久知道了,这样你会没朋友的)。那么我先向你工位扔一团纸,纸上写着一个数字J。


第二步:如果你在工位,你会接到那团纸,然后你对J+1(相当于告诉我,你在工位),顺便又自己写了一个数字K,然后扔给我。


第三步:我接到那团纸,看到J+1,我知道你已经确认了,然后我对K+1,然后扔给你。


之后,我只需要走到拿着文件走到你的工位上给你就好了。so easy!


这个知识了,可以说是每次面试的必考题。下次再想不起来,就想想这个送文件的例子,多么的形象。


唉!


天下没有不散的宴席。当数据传递完以后,客户端和服务器还是要分手的。不管之前怎么海誓山盟,海枯石烂,所有的誓言,都抵不住一句话:我们已经没得聊了。虽说是分手,但不能默默的分,想想确认关系搞得多复杂,分手的时候更要做的轰轰烈烈。


下面说说TCP关闭连接,也就是客户端要和服务端分手(确认关系是你主动的,分手也是你主动的,兄弟(或姐姐)你真牛)。



关闭TCP连接:四次挥手

第一步:当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN为finish)。f


第二步:主机B收到这个FIN报文之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK, 同时通知自己的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重复传FIN报文段)


第三步:主机B的应用程序告诉TCP:我要彻底关闭连接,TCP向主机A发送一个FIN报文段。


第四步:主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放 。


挥一挥衣袖不带走一片云彩,协议终止。


这个就不给大家举例子了,太伤感,这是一个凄美的故事。



这是分界线。这是分界线。这是分界线。这是分界线。这是分界线。


今天和大家聊一个什么呢?聊一聊信息确认!


先问问大家,在你的工作中有没有因为工作内容不确定导致延误工期的事情发生。有,当然有,而且还很多。


小明(好了,看到小明这两个字就知道这个故事是杜撰的)在一家公司做秘书。周一的时候老板把他叫到办公室:“周五的时候,我需要和各部门经理开会,讨论一下公司近期的业务发展,你去准备一下最近的新增用户的数据。” 可怜的小明,在家刚和老婆吵完架(让你和媳妇吵架)。老板说的时候,他根本没有注意听。等老板说完了,他只听到了老板周五需要数据,至于什么数据,不知道。老板平时非行严厉,小明也不敢再询问。


时光飞逝,岁月如梭,转眼间到了周五。


早晨,老板对小明说:“数据准备的怎么样了” 。


“我当时没有听清,怕被挨训,所以就没有再问。”


“马上就要开会了,你让我拿什么开会。”


“老板,我错了!”


“错哪儿了?”


“我当时应该向你确认一下信息的。”


好了,故事就说到这里。相信大家也都能看明白,小明的失误在于因为怕被训,所以没有向老板确认信息。


信息在传递的时候是会丢失的。所以,信息确认就显得尤为重要。它能保证两个人对同一信息的理解,不至于相差太远。


像我们的TCP,客户端就是一个很好的范例。下面用白话说一遍:

客户端问:服务端在吗?

服务端说:在。

客户端说:我要给你传数据了,你准备接收吧!


喜欢聊技术或者聊观点,可以加入公号:【花生读书汇】

一起:励志,成长,学习,分享。


0 0
原创粉丝点击