文章转自https://blog.csdn.net/gui951753/article/details/79386734#commentBox
这是个大神
目录:
从一张图看网络参数,我们经常使用网络的人都会见过下面这张图,不过一般情况下大家都不会手动去配置,而是选择自动获取。那么有的时候当我们网络出现故障了,无法自动获取了,可能就需要去手动设置ip,所以还是需要对下面这些参数进行一定的了解的。
从上图我们大概可以看到,小明和小美是处在同一个局域网内的,而小丽和他们都不在一个局域网内,那么肯定就会有两种情况发生,一种是统一局域网之间的通信,还有一种情况就是不同局域网之间的通信。下面就分别对这两种情况进行细致的说明。
小明和小美之间通信,其实就相当于小明主机ping10.1.1.3。下面我们来分析一下ping的这个流程。
1)小明利用自身的子网掩码和小美的ip地址进行&运算,得到小美的网段号。然后小明发现自己和小美处在同一个网络中。
2)检查自身的arp缓存
也就是上图中小明和小丽的通信:
小明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百度得到的结果,而小明电脑上将会收到跟我这个类似的结果。
上图是我和室友在教室的网络拓扑图。下面我们来探讨下,阿呆,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报文,然后浏览器将这份报文和百度服务器的ip交给tcp进程。tcp进程虽然知道了目的Ip地址,但是觉得不安全,不敢发出去,他觉得先发个ip包看看能不能收到比较好一点儿,于是有了第三步,TCP三次握手。
首先,我们来看一个简单的示意图,阿呆和百度服务器进行了三次对话.
由通话A和通话B,我们能够确定阿呆to服务器这条信道是通的
同理,由通话B和通话C,我们能够确定服务器to阿呆这条信道是通的
问题:为什么是三次握手,而不是二次或四次
这个问题很多人都有不同的见解,知乎上关于这个话题的讨论,我贴在下面:
知乎:为什么要三次握手,而不是二次,四次
谈一下自己的理解:
三次是保证双方互相明确对方能收能发的最低值。再往上加握手次数不过是提高“它是可用的”这个结论的可信程度。在ip进程的眼里,三次握手就是三个ip包,也就是说,我们在传送数据之前,就花费了三个ip包的代价
到了这一步TCP真正开始传输数据了。
百度服务器开始把自己的主页内容,也就是上图的内容回传给阿呆,我们假设百度回传的内容只有一个ip包(实际可能很多)那么回传的过程也很好理解,类似于第四步,一个ip包的内容是要发送的数据,一个ip发送的内容是:确认收到。服务器发送内容为百度主页的ip包,阿呆发送内容为“确认收到”的ip包
同样,这两个ip包也只发送了一个数据,这个数据是百度的主页内容。
简而言之,tcp的可靠传输机制就是己方发送数据,对方发送确认
tcp连接是耗费资源的,包括内存资源和端口资源,所以当我们传输完数据之后,是时候说再见了,于是我们就有了四次挥手说拜拜。
为了方便我们更好地理解tcp。我们可以把tcp连接看成两根水管儿,如上图所示,一个蓝水管,一个红水管。对于阿呆而言,蓝水管是出水管负责发送数据给服务器,而红水管是进水管负责接收来自于服务器的数据,对于服务器而言,蓝水管是进水管负责接收阿呆发的数据,红水管是出水管负责给阿呆发送数据
我们关闭TCP连接,其实就是要关闭这两根水管。我们利用四次对话来关闭这两根管道。
于是,阿呆就关掉了他的出水管(蓝水管)
于是,服务器就关掉了他的出水管(红水管)
到此为止,TCP进程释放资源完毕。
从tcp建立连接到tcp释放连接我们一共用了11个ip包。tcp建立连接(三次握手)用了3个包;tcp传送数据用了4个包,其中两个用于传送数据,两个用来确认收到数据;关闭tcp连接(四次挥手)用了4个包。
这篇博文花费了我一天的时间,很多图片都是我利用visio和亿图这两个工具画出来的。里面有诸多内容有借鉴之处。其中着重参考了知乎大神车小胖的《计算机是如何进行通信的》一书,也参考了许多知乎大神关于计算机网络的见解。如果他人要转载,麻烦注明出处。
by 小小呆