五分钟讲个故事带你入门计算机网络全站第二佳

一次点赞到底发生了什么

为什么要写这一篇博客

听到HTTP、TCP/IP、RPC的时候我头都是大的,跟着文章深究,越学越糊涂。我有时候希望学习是轻松的,能够大体的掌握发生了什么,从具体到抽象,从整体到细节,所以在学习计算机网络之前,我非常建议您冲一杯咖啡,安安静静的和我一起看完一次网络访问的流程。

从点赞开始

打包和来人帮我!

当你看到Jenis的文章,觉得Jenis写的真不错!于是便想着给Jenis点个赞,摁下大拇指时,你的设备会把这次请求(发送一个点赞的请求)打包(按照HTTP的格式)成一个大包裹(数据包),而包裹的内容就是“为Jenis点赞”,而此时我知道这个请求要去哪,去该博客的服务器对吧,但是我们知道在通信的时候,对于人类而言IP地址是不友好的,我们只能理解域名,所以基本都写成域名形式访问,而此时需要有域名对应的IP地址,反过来发送数据的时候,要来个哥们帮我,他做个翻译。这时候他来了,DNS。

DNS工具人

DNS有个表,里面可以查到你要访问的域名所对应的IP地址,他告诉你IP地址之后,你把它记在脑子里了(不是写在了包裹上),所以地址有了,准备出发!

出发第一步就卡住了

不是为啥我到村口卡住了呀?好嘛,一个大黑壮男子堵住了去路,我问他做咋子?!他说:办事你得按规矩。他跟我说,我既然要发数据,那就必须签下协议书,表明你是哪一派的!?这时,两个哥们跳出来了,TCP和UDP。他们两说:“我会给你穿个衣服,这样你以后的路就好走的多!”原先就已经是个被打包的包裹,又加了一层纸皮,上面写着各种看不懂的信息(答应我不是看不懂,等下到TCP再聊),TCP身强力壮,原本以为他要带我出村了,结果领着我去拜了码头,村里面见识最广的老头,IP长老。

请注意,这里我只是为了故事的流畅性而写TCP带着我去找IP协议,事实上,并无关系。

长老的智慧

IP长老看到我,就看出我心怀鬼胎,因为我居然没有把IP地址写在包裹上,长老轻轻甩动他的权杖,一道魔法屏障缠绕在数据包上,魔法上写着我的家住地址(这台计算机的IP地址)和数据的目标地址(DNS翻译的那个地址),并且把TCP那小子的名字码也Copy了一份套在魔法屏障上(二进制协议码)。现在第二个问题出现了,我这个村里面的小混混为了行侠天下自己取了有别名,而长老掐指一算,一眼就看出了我的别名,这个问题就是

客户端有多个网卡,就会有多个 IP 地址,那 IP 头部的源地址应该选择哪个 IP 呢?
在长老的手中有一本魔法书叫“路由表“,他存储着我的别名(其他网卡的IP)并且携带着对应的子网掩码(Genmask),只需要将目标的IP和子网掩码的十进制做&与运算,得到的数字是否匹配我的别名,匹配哪个就说明是哪个名字发出的数据
会注意到有一条子网掩码是0:0:0:0,这是我的无敌外号,当别的外号都不管用时,只需要说我是真龙天子别人就会放你过了,意思就是别的IP与运算都无法得到结果,那就使用这个0:0:0:0作为来源IP

总算是可以出发了,带着TCP兄弟和IP魔法屏障,出发。

再次出发再次卡住

不是为啥我又卡住了呀?欸欸欸,大哥你这写的地址也太遥远了吧,我只能给你送出村口,我们去问问镇上的人认不认识这个地方。这个镇上的人,就叫做MAC。MAC头部是以太网的头部,他包含着接收方和发送方的MAC地址,用于两点间传输,底部写着使用哪种协议传输(IP老头的协议)。发送方的MAC地址倒是简单,在一台机器的出厂时,就已经被写死在网卡的ROM中了,这里重点是接收方的MAC地址。

ARP来了

别人的MAC地址就相当于身份证号,总不能在大马路上一个一个人翻他的包包说查身份证!我们不如喊出他的名字,当他发现在喊他时,就会回头问你,找他干什么,这样我就找到了他且能够知道他的身份证号。

ARP协议就是这个广播在以太网中大喊大叫,对所有设备喊出目标IP地址,直到有人认识这个IP,并返回这个MAC。

ARP不是没记忆,他有一个记忆存储ARP 缓存,但是事实上确实有点鱼的记忆,只记得几分钟,如果在发送报文的时候查找ARP有对应MAC地址,就直接使用,没有就只能再次广播。

MAC加IP加TCP加HTTP带着我坐飞机寄行李—网卡

至此,MAC、IP、TCP和HTTP头部写在我的头部,到了去省城的日子了,总算要出门了,结果突然说外地人不讲我们二进制语言,应该把语言转为电信号,还有坐飞机要放行李!这个转化的机器就是网卡,而控制网卡的人叫网卡驱动设备。

网卡驱动抓住我的包裹,复制到他的缓存中,为了等下下机(传输完毕)的时候,不丢掉包裹,就为这个包裹的开头加上报头起始帧,在结尾放上检测帧(正确叫帧校验序列)。

  • 起始帧为了标记这个包开始的地方,为了传输后能够锁定他

  • FCS(帧校验序列)为了检查这个传输过程包是否损坏

最后,一切准备完毕,我的包裹随着网线发送出去了

转机口—交换机

包接收

我的目的是远在M国的表哥,我省的飞机无法直达,只能到国内的中转站啦,S市。“晕死我了”,我来看看到哪,“交换机!”,到了中转站,检查一下我的包裹,我看看FCS和原来有没有区别,没问题就扔在机场的缓存中。等待下一次发机,这里和刚才网卡发送有什么区别呢?因为刚才省城的机场(网卡)有自己的MAC地址,一个包裹进来,发现目标地址不是自己的MAC地址,直接丢弃,避免堆积;而S市(交换机)不同,包容万象的他没有MAC地址,啥也不检查,直接存入。

包发送

交换机没有MAC地址,但是有一张MAC地址表,包裹进入缓存后发出时,检查目的MAC地址是否在这张表中。

这张表有两个重要内容

  • 某个设备的MAC地址号

  • 该设备对应的端口,也就是机场那么多登机口,要走哪个

当目标MAC地址在这张表时,直接把包裹放在这个端口踢出去(开玩笑)!

不在时,说明该地址的设备还未曾向该交换机发送过包,或者太久没发包,被删除了,而这种情况下,交换机有国际电话而且是群发制的(广播)。就把这个包转发到所有端口(除了来源端口),这样就能确保总能有人回应的。不要紧张,还记得我们学习过的在设备中的网卡吗,当他识别到来的包不是写着他的MAC地址时,就会丢弃掉忽略这个包。

什么时候写入MAC地址表

前面介绍了,当曾经在这个交换机上交流过,地址信息和端口就会被交换机记录在那个MAC地址表上,而如果我发出的包得到了对面回应,则这次的信息就会被该交换机记录写入MAC地址表

当包裹上的MAC是主动广播的MAC地址

如下:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF

  • IP 地址中的 255.255.255.255

那么交换机就会把信息广播到源端口外的所有端口

国外的转机和国内不同欸—路由器

写在最前面

路由器转发机制和交换机其实差不多(指查表寻找包的转发目标)

区别在于

  • 路由器有自己的MAC地址和IP地址,基于IP设计的,称为三层网络设备

  • 交换机是基于以太网设计的,称为二层网络设备,不具有MAC地址

所以,路由器的端口因为有了MAC地址,可以作为以太网的发送和接收方,又因为有IP地址,所以理论上和计算机网卡区别不大。当转发包时,路由器端口会接收自己的以太网包,查表,然后由相应的端口作为发送方转发。

包接收的故事

到了国际站,中转海关都变得不友好了,发现这不是来这的机票(包的头部写的MAC地址不是该路由器的MAC地址),直接给爷爬!如果是也放进缓冲中等待下一次发机。

路由表

进入缓冲的包裹,这群人会去查表,但是查表之前,通过传送带到机械臂的这关包裹就已经发生改变了,把包头部的MAC头部撕掉!

MAC头部的作用就是将包送到路由器,而到此之前的MAC头部已经无用了,路由器就主动将包裹的MAC头部丢弃,再进入查表(路由表)回合。

路由匹配和之前交换机一样将该条目的子网掩码目标IP做&与运算,得到结果如果和条目地址吻合则发送,不吻合就向下遍历

同样的,实在找不到则选择子网掩码为0.0.0.0的默认路由

偷一下小林的图

包发送

在找到目标地址时,其实要做次判断,判断什么?判断找出来的这行条目中的网关(Gateway)列是保存着IP地址还是空

如果为IP地址,如上图第三条,则认为还未找到最终目标地址,先往这个IP发去,你可能有疑问,这不是目标地址那是什么?还记得我说的路由器是三层网络设备吗,具有IP,这个IP地址就是指向离目标更近的另一个路由器。

如果为空,如上图一二条,说明已经找到目标了抵达终点,直接朝这个包裹头部的写的IP地址发去即可。

老朋友ARP又来了

所以此刻无论如何我们都握着一个IP地址,等待再次出发了,还记得我们在村里的时候吗,每次IP发送就需要映射找到对应的MAC,要接收方的MAC,需要一个大喇叭ARP,来帮我广播寻找MAC地址啦,接下来通过路由器的端口发出去,这个工作过程和计算机一致。而这样设计的原因,就是无论我下一站是到了目标地址(直接连接着目标服务器可以认为一台计算机的路由器)还是下一个路由中转站,都有类似网卡的机制,重复刚才提过的包接收的过程

  • 判断MAC地址是不是来这的,不是的话给爷爬,是的话进入缓冲

  • 撕掉MAC头部,找IP

  • 拿着IP地址做与运算,依网关确定,下一个IP地址

  • ARP寻找依靠IP广播得到下一个MAC地址

回头聊聊MAC

不知道你注意到没有,MAC好像那种即时的标志,所以很多博客和书说MAC地址的作用就是在以太网内中的两个设备之间的交流通讯。MAC地址每经过一次转发就被这个设备删去,写入,删去,写入。。上一个写入的和下一个写入的毫无关联。而始终不变的是源IP和目标IP地址。不知道解释到这,你是否能够理解MAC所谓的两个设备之间包传输。

到了目的地了—服务器!

这一路,从村口被拦住,到许多伙伴,国内人、国外人不同的语言(电信号和数字信号),不同的机器,风雨飘零,到了M国,我拿着一杯啤酒回头看这一路,而那个包裹就交给那个服务器。

回头这一路!
  • 应用层—HTTP头部

  • 把客户在应用层的行为,以HTTP协议规定的模式,打包起来

  • 传输层—TCP头部

  • 识别包裹大小,以合适的大小(不大于MSS)分块

  • 控制各个分块后的小包顺序,和流量控制不至于卡死等之类的差错检测

  • 提供应用进程的通信,所谓端口控制,在TCP头部记录端口,能够确认是被哪个进程监听的或者说接收的。

  • 复用和分用。复用是指不同应用进程可使用同一个传输层协议传输数据,分用则是指接收方的传输层在剥去报文首部以后可以将数据发送到对应的进程。

  • 网络层—IP头部

  • 我们应该知道传输层并不实现传输,他是服务于应用端的,而真正控制数据通过网络传输的是网络层。我们可以简单记忆,传输层是帮助实现应用到应用的通信,而网络层是一个设备到一个设备

  • IP同样会识别包裹大小,超过MTU(一般为1500字节)再次分块

  • IP协议拥有的第一个能力是寻址

  • IP地址分为两种意义,以便于寻址定位

  • 一个是网络号,负责标识该IP是在哪个子网下的

  • 一个是主机号,负责标识是那个子网下的哪个主机

  • 如何实现呢这个分别?

  • 将IP地址与子网掩码按位与运算—>得到网络号

  • 将IP地址与取反后的子网掩码按位与运算—>得到主机号

  • 第二个功能路由

  • 实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。

  • 链路层—以太网(MAC)头部

  • 以太网是一种局域网,把附近设备连接起来,以便于他们之间可以通信

  • 以太网在判断网络包目的地时是使用MAC地址,所以链路层把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址。

  • 可靠传输:在WLAN中常用保证可靠传输,以后专门聊

  • CRC差错检测,我们在说MAC地址的时候经常说当网卡他发现这个包裹不是发给他的时候,会直接丢弃

服务端拆开包裹!

当包裹到达服务器时,服务器查看MAC头部看看地址是不是正确,不正确丢弃。

接着扒开IP头,IP地址符合,根据IP头的协议确定传输协议是TCP协议。

扒开TCP头部,里面一个序列号,查看是否是我想要的序列号,是的话返回一个ACK,不是就丢弃(这里隐藏了TCP三次握手问题)。

TCP头部还有一个端口号,HTTP服务器正在监听这个端口号,于是服务器就知道是HTTP进程想要这个包(这里举例了应用间或者说进程间传输),发给HTTP进程。

而到了HTTP进程知道你原来是要“为Jenis点赞”,于是就把这个需求在服务器内做处理,然后把结果封装在HTTP响应(response)报文。

而同样的和客户端一样,这个报文同样要穿上TCP、IP、MAC头部,从网卡出去,交换机转发到网络的路由器,然后转发呀转发又回到我的村里,我打开包裹赫然写着一行字“Jenis感谢您的点赞,希望您生活顺利,事事顺心”

最后的最后

客户端看完了我的文章,要离开了,向服务器发出了四次挥手,双方连接断开

看到这里如果觉得Jenis写的不错就点个赞吧,让你的机器真正的跑一遍网络请求吧,感谢你的支持

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值