为什么ICMP的ping和tracert不经过tcp或udp?

答:

希望用图片的形式能帮你建立起OSI分层的概念,更多细节需要你阅读教材。
图1至图4展示了一个完整的ICMP报文。
图1可见,该报文的结构为:Frame,Ethernet,IP,ICMP。选中Frame可以看到整个报文都被选中。

图1

选择Ethernet后,如图2显示。下面被选中的数据就是Ethernet报文的头部,Ethernet位于数据链路层。那Ethernet的数据部在哪?头部后面都是数据部。

图2

选择IP后,如图3显示。下面被选中的数据就是IP报文的头部,IP位于网络层。头部后面都是数据部。

图3

选择ICMP后,如图4显示。下面被选中的数据就是ICMP报文的全部。

图4

图5至图9展示了一个完整的TCP报文。图5可见,该报文全长3104bit。

图5

图6展示了以太网报文的头部。

图6

图7展示了IP报文的头部。

图7

图8展示了TCP报文的头部,它位于传输层。

图8

图9展示了SSL报文的全部内容,它位于应用层。

图9

总结一下:
1.OSI将网络划分为7层,最低为物理层,最高为应用层。高层报文封装在低层报文中,比如TCP之于IP。前面的图表明,封装的含义就是高层报文的全部被放置在低一层报文的数据部。但是要注意,封装的关系不等于分层的高低关系。比如,ICMP封装在IP中,但是他们都在网络层。ARP封装在ethernet中,但是它们都在数据链路层。
2.从封装结构可见,不存在ICMP要经过TCP,因为它们俩都封装在IP中。你可以说它们都要经过IP,然后IP要经过ethernet。不管你上层走什么协议,以太网最终都要封装成ethernet数据包进行传输。
3.一般把tcp和udp叫传输层,运输层听起来怪怪的,不过也无伤大雅。

作者:龙辰原
链接:https://www.zhihu.com/question/22693759/answer/129255622
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

再补充个问题:

tcp首部只有端口号没有ip地址,那么网络层怎么知道目的ip地址的呢?

比如http请求,应用层dns就解析出了目的ip地址,但是没记录在传输层的tcp首部中?下一层却知道了?

答1:

想必读者已经知道,浏览器发送HTTP请求,最终会以HTTP报文到达服务器,服务器理解HTTP报文,会做出响应的动作。从这个意义上来说,浏览器是以HTTP报文与服务器间接打交道,这是最终目标。

浏览器 --------HTTP --------服务器

此外,浏览器在本地还有一个直接打交道的角色,浏览器通过Socket与本地TCP直接打交道,这是实现最终目标的手段,注意手段与目标的区别,目标是我们最终的目的无非通过HTTP拉下来一个网页,而手段是我们采取的具体步骤。

如下方示意图:

浏览器
|
Socket
|
TCP

首先浏览器通过DNS解析得到服务器的IP,调用Socket Connect()来告诉TCP,自己想和服务器IP连接,否则TCP又不是浏览器肚子里的蛔虫,TCP无法知道,所以这是最最起码的入口参数。此外,浏览器还应该告诉TCP,服务器的端口,如果用户不输入,采用缺省80端口;如果用户输入则使用用户输入端口。

至此,TCP拥有了封装TCP头一切必要信息

Destination Port
Source Port

封装成TCP报文发送给IP来封装IP头、并路由处理,同时会把Destination IP / Source IP 传递给IP层,这个很简单,不再展开。

总结一下:浏览器的一生需要和两个角色打交道,一个是远端的服务器,使用业界标准HTTP协议;另一个是本地的TCP,需要把目的IP/Port传递给TCP,TCP再传递给IP。

总结:

1、DNS解析

2、调用Socket Connect()传递给TCP

3、tcp将tcp报文以及目标ip传递给ip层

4、ip层封装tcp报文 并且 将目标ip填到ip分组首部中

目标ip是经过链路层传递给网络层的,并不是直接跳过链路层。

作者:车小胖
链接:https://www.zhihu.com/question/54795054/answer/141130654
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答2:

链接: https://www.zhihu.com/question/54795054/answer/141117982

猜你喜欢

转载自blog.csdn.net/a3192048/article/details/82083268