计算机通信:原理与实践

发表时间: 2020-04-29 14:00

作者:逃离地球的小小呆

原文:
https://blog.csdn.net/gui951753/article/details/79386734

目录:

网络常见术语介绍

计算机之间是如何互相通信的

相同网段的通信

不同网段的通信

计算机如何访问Internet

第一步:域名解析

第二步:打包http报文

第三步:http触发TCP进程三次握手连接

第四步:TCP传输HTTP

第五步:服务器回传自身网页

第六步:释放TCP连接(四次挥手)

总结


网络常见术语介绍

从一张图看网络参数,我们经常使用网络的人都会见过下面这张图,不过一般情况下大家都不会手动去配置,而是选择自动获取。那么有的时候当我们网络出现故障了,无法自动获取了,可能就需要去手动设置ip,所以还是需要对下面这些参数进行一定的了解的。



ip地址:这是一个很大很繁琐的东西,大家只需要知道电脑之间如果想要进行通信,就必须有一个网络地址来识别每一台电脑。就好像我们打电话一样,你要给你女朋友打电话,你就必须知道你女朋友的电话号,你如果想和目的主机通信,你就必须知道目的主机的ip地址。


子网掩码(subnet mask):将某个IP地址划分成网络地址和主机地址两部分。通常,我们使用子网掩码和目的Ip进行&运算,来判断目的Ip和自己的ip是否是在同一个局域网内。


默认网关(default gateway):我们可以把网关理解为路由器的ip地址。我们把ip地址拟人化,那么网关就是一栋大厦的门卫,所有人进出都要通过他。举个例子,小米路由器的默认网关是192.168.31.1。而TPlink等等的大部分是192.168.0.1或者192.168.1.1。这些路由器所管理的所有主机要访问外网的主机时,就必须要通过他们的默认网关。


DNS服务器:域名服务器(Domain Name Server)。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器 。我们可以通俗的把它理解为一个黑盒子,你输入域名,他就会输出这个域名对应的ip地址。网络之间通信还是靠的是ip,但是大多数人记不住这么多Ip,所以我们就想到了一个办法建立一个黑盒子来实现ip和通俗域名之间的转换。


DHCP服务器:就是能够自动识别当前网络环境,并依照当前网络环境给你分配合适的ip地址的服务器。它的存在就是使手动设置Ip变得更加傻瓜式,实现一键上网。不需要你自己进行手动的配置

ping:it术语中的ping类似于下图的声呐设置,如果目的电脑联网,目的电脑会把这个Ping包发送回来。如果目的电脑不联网,则ping包不会返还任何信息。所以在It界会经常使用这个命令来检测电脑是否已经连上网络。



网段号:我们知道ip由两部分构成 网段号+主机号。当我们使用自身的子网掩码和目的主机进行&运算时,我们就能得出目的主机的网段号,进而判断目的主机与自己是否处在同一个网络中。


arp: 将已知的ip地址解析为对应的mac地址。(具体请百度)

集线器、交换机、路由器等设备介绍,请参看我下面的这篇博文。

https://blog.csdn.net/gui951753/article/details/79402528

子网划分:对于该知识点的理解,可以参看下面博文:

https://blog.csdn.net/gui951753/article/details/79412524


计算机之间是如何互相通信的



从上图我们大概可以看到,小明和小美是处在同一个局域网内的,而小丽和他们都不在一个局域网内,那么肯定就会有两种情况发生,一种是统一局域网之间的通信,还有一种情况就是不同局域网之间的通信。下面就分别对这两种情况进行细致的说明。


相同网段的通信:

小明和小美之间通信,其实就相当于小明主机ping10.1.1.3。下面我们来分析一下ping的这个流程。


1)小明利用自身的子网掩码和小美的ip地址进行&运算,得到小美的网段号。然后小明发现自己和小美处在同一个网络中。

2)检查自身的arp缓存


  • 当IP层的ARP高速缓存表中存在目的IP对应的MAC地址时:
  • 直接封装这个ping包并发送给小美
  • 当IP层的ARP高速缓存表中不存在目的IP对应的MAC地址时:


小明按照路由表中的默认接口ETH0发送广播给整个局域网,局域网内的每台主机都收到了这个信息,其他主机都无反应,但是小美这台主机10.1.1.3意识到这是在叫自己。然后采取点对点单播回复小明:我在这里,我的mac地址是xxxx.以后你可以用这个联系方式联系我。小明收到此回复后,保存到自己的通讯录中(arp缓存中),方便下次联系。然后通过刚才记录的小红的mac地址发送ping包,依照类似的步骤,很快小红发出了回信。小明主机收到ping包的返回内容。


不同网段的通信:(也就是上图中小明和小丽的通信)

小明ip:10.1.1.2/24

小丽ip:10.1.2.2/24


第一步:判断是否在同一个网段

小明将自己的子网掩码和小丽的ip进行&运算,发现二人不在同一个网络内。小明无法利用上文中的通信手段和小丽进行通信


第二步:查找路由表

既然无法直接通信,小明就想有没有别的道路能够到达小丽。于是他查看了自己的路由表,信息如下:



路由表内并没有小丽的Ip信息。走投无路的小明决定走0.0.0.0这条路,0.0.0.0是默认路由,它的终点站是默认网关。


第三步:发现网关的mac地址

小明将网关的ip进行了第一步的操作,发现他们是在同一个网络中,于是利用arp协议小明得到了默认网关的mac地址。


第四步:发送ping包给网关。


第五步:网关接收以太网帧。


第六步:网关路由转发。


网关ip层查看这个ping包,去路由表里尝试能否匹配到小丽的ip,下面是默认网关的路由表信息。


刚好路由表里的第二条匹配到了小丽的网段号,到达下一条的方式是广播,所以网关开始发送ARP广播,并得到了小丽的mac地址,于是网关将这个ping包发送给了小丽。


第七步:ping包弹回

小丽收到这个ping包后,不修改任何内容,重复第一步到第六步的内容,将这个ping包发送给了小明。


第八步:ping程序打印输出。



上图是我用自己主机ping百度得到的结果,而小明电脑上将会收到跟我这个类似的结果。


计算机如何访问Internet



上图是我和室友在教室的网络拓扑图。下面我们来探讨下,阿呆,ip:172.18.0.200是如何访问百度服务器的,其过程是怎样的。


当阿呆想要上百度的时候,阿呆就在浏览器中输入www.baidu.com,那么接下来,电脑,路由器,以及百度服务器都做了什么呢?


第一步:域名解析

首先浏览器(程序)告诉DNS进程(程序)请帮我解析www.baidu.com的ip地址,然后才有一下dns的一系列操作。


①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了。

②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如我现在要访问百度:http://www.baidu.com/, 并将这个主机名传送给DNS应用的客户端。

③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)。

④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址。

⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接。


其实也就是通过dns服务器,使我们能获取到域名背后的ip地址。


第二步:打包http报文



如上图所示浏览器将阿呆访问百度的请求打包成http报文,然后浏览器将这份报文和百度服务器的ip交给tcp进程。tcp进程虽然知道了目的Ip地址,但是觉得不安全,不敢发出去,他觉得先发个ip包看看能不能收到比较好一点儿,于是有了第三步,TCP三次握手。


第三步:http触发TCP进程三次握手连接

首先,我们来看一个简单的示意图,阿呆和百度服务器进行了三次对话.



通话A_阿呆to服务器:老铁,有空嘛,听到请回答。

通话B_服务器to阿呆:阿呆,我听得到,你能听到我嘛?

由通话A和通话B,我们能够确定阿呆to服务器这条信道是通的。

通话C_阿呆to服务器:我也听得到你

同理,由通话B和通话C,我们能够确定服务器to阿呆这条信道是通的


问题:为什么是三次握手,而不是二次或四次。谈一下自己的理解:

两次握手:只能确定阿呆能发给百度信息,百度能收到,有可能百度to阿呆的信道是不通的,就有可能出现下面的情形:


因为信道不通,不知道对方喜欢自己,导致默默流泪,孤独终老。


四次握手:我们通过三次就能够知道阿呆和百度之间是能够互相通信的,多增加一次握手,没有任何实际意义。


三次是保证双方互相明确对方能收能发的最低值。再往上加握手次数不过是提高“它是可用的”这个结论的可信程度。在ip进程的眼里,三次握手就是三个ip包,也就是说,我们在传送数据之前,就花费了三个ip包的代价。


第四步:TCP传输HTTP。到了这一步TCP真正开始传输数据了。


首先TCP把阿呆要访问百度服务器的请求打包成一个ip包,然后发送给服务器,这个ip包里面不但有阿呆的请求,还有一个唯一的序列号.比如序列号为9527。服务器收到请求的ip包后,回传一个ip包,告诉阿呆,我收到序列号为9527的Ip包了。我们由此知道这个序列好的作用就是让阿呆知道服务器确实收到了请求ip包而不是其他ip包。


上述过程涉及到了两个ip包,一个是阿呆发送的内容为”请求访问服务器”的ip包,另一个是服务器发送的内容为”收到你的请求”的ip包。


这两个ip包总共传送了一个数据,就是请求访问服务器。服务器发送的IP包,主要是为了发送确认收到。


第五步:服务器回传自身网页。



百度服务器开始把自己的主页内容,也就是上图的内容回传给阿呆,我们假设百度回传的内容只有一个ip包(实际可能很多)那么回传的过程也很好理解,类似于第四步,一个ip包的内容是要发送的数据,一个ip发送的内容是:确认收到。服务器发送内容为百度主页的ip包,阿呆发送内容为“确认收到”的ip包。


同样,这两个ip包也只发送了一个数据,这个数据是百度的主页内容。简而言之,tcp的可靠传输机制就是己方发送数据,对方发送确认。


第六步:释放TCP连接(四次挥手)。


tcp连接是耗费资源的,包括内存资源和端口资源,所以当我们传输完数据之后,是时候说再见了,于是我们就有了四次挥手说拜拜。



为了方便我们更好地理解tcp。我们可以把tcp连接看成两根水管儿,如上图所示,一个蓝水管,一个红水管。对于阿呆而言,蓝水管是出水管负责发送数据给服务器,而红水管是进水管负责接收来自于服务器的数据,对于服务器而言,蓝水管是进水管负责接收阿呆发的数据,红水管是出水管负责给阿呆发送数据。


我们关闭TCP连接,其实就是要关闭这两根水管。我们利用四次对话来关闭这两根管道。


通话A_阿呆to服务器:老铁,我没水(数据)要送了,准备关出水管了(蓝水管)(服务器的进水管)。


通话B_服务器to阿呆:阿呆啊,你的所有水,我都接收完毕,你可以关掉蓝水管了。


于是,阿呆就关掉了他的出水管(蓝水管)。


通话C_服务器to阿呆:阿呆啊,我没水要送了,准备关出水管了(红水管)(阿呆的进水管)。


通话D_阿呆to服务器:老哥,你的出水管里的水(数据)我已经接收完毕,请放心关闭。


于是,服务器就关掉了他的出水管(红水管)。到此为止,TCP进程释放资源完毕。


从tcp建立连接到tcp释放连接我们一共用了11个ip包。tcp建立连接(三次握手)用了3个包;tcp传送数据用了4个包,其中两个用于传送数据,两个用来确认收到数据;关闭tcp连接(四次挥手)用了4个包。