互联网协议入门(二)

作者: 阮一峰

日期: 2012年6月11日

上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想。

这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。

==============================================================

互联网协议入门(二)

作者:阮一峰

(接上文)

七、一个小结

先对前面的内容,做一个小结。

我们已经知道,网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:

发送这个包,需要知道两个地址:

  * 对方的MAC地址

  * 对方的IP地址

有了这两个地址,数据包才能准确送到接收者手中。但是,前面说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发。

上图中,1号电脑要向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑。

1号电脑把数据包发到网关A,必须知道网关A的MAC地址。所以,数据包的目标地址,实际上分成两种情况:

场景数据包地址
同一个子网络对方的MAC地址,对方的IP地址
非同一个子网络网关的MAC地址,对方的IP地址

发送数据包之前,电脑必须判断对方是否在同一个子网络,然后选择相应的MAC地址。接下来,我们就来看,实际使用中,这个过程是怎么完成的。

八、用户的上网设置

8.1 静态IP地址

你买了一台新电脑,插上网线,开机,这时电脑能够上网吗?

通常你必须做一些设置。有时,管理员(或者ISP)会告诉你下面四个参数,你把它们填入操作系统,计算机就能连上网了:

  * 本机的IP地址
  * 子网掩码
  * 网关的IP地址
  * DNS的IP地址

下图是Windows系统的设置窗口。

这四个参数缺一不可,后文会解释为什么需要知道它们才能上网。由于它们是给定的,计算机每次开机,都会分到同样的IP地址,所以这种情况被称作"静态IP地址上网"。

但是,这样的设置很专业,普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活。出于这两个原因,大多数用户使用"动态IP地址上网"。

8.2 动态IP地址

所谓"动态IP地址",指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做"DHCP服务器"。新的计算机加入网络,必须向"DHCP服务器"发送一个"DHCP请求"数据包,申请IP地址和相关的网络参数。

前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP协议做了一些巧妙的规定。

8.3 DHCP协议

首先,它是一种应用层协议,建立在UDP协议之上,所以整个数据包是这样的:

  (1)最前面的"以太网标头",设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。

  (2)后面的"IP标头",设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

  (3)最后的"UDP标头",设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发给我的",而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。

8.4 上网设置:小结

这个部分,需要记住的就是一点:不管是"静态IP地址"还是"动态IP地址",电脑上网的首要步骤,是确定四个参数。这四个值很重要,值得重复一遍:

  * 本机的IP地址
  * 子网掩码
  * 网关的IP地址
  * DNS的IP地址

有了这几个数值,电脑就可以上网"冲浪"了。接下来,我们来看一个实例,当用户访问网页的时候,互联网协议是怎么运作的。

九、一个实例:访问网页

9.1 本机参数

我们假定,经过上一节的步骤,用户设置好了自己的网络参数:

  * 本机的IP地址:192.168.1.100
  * 子网掩码:255.255.255.0
  * 网关的IP地址:192.168.1.1
  * DNS的IP地址:8.8.8.8

然后他打开浏览器,想要访问Google,在地址栏输入了网址:www.google.com。

这意味着,浏览器要向Google发送一个网页请求的数据包。

9.2 DNS协议

我们知道,发送数据包,必须要知道对方的IP地址。但是,现在,我们只知道网址www.google.com,不知道它的IP地址。

DNS协议可以帮助我们,将这个网址转换成IP地址。已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口)。

然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105。于是,我们知道了对方的IP地址。

9.3 子网掩码

接下来,我们要判断,这个IP地址是不是在同一个子网络,这就要用到子网掩码。

已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算(两个数位都为1,结果为1,否则为0),计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。

因此,我们要向Google发送数据包,必须通过网关192.168.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。

9.4 应用层协议

浏览网页用的是HTTP协议,它的整个数据包构造是这样的:

HTTP部分的内容,类似于下面这样:

  GET / HTTP/1.1
  Host: www.google.com
  Connection: keep-alive
  User-Agent: Mozilla/5.0 (Windows NT 6.1) ......
  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  Accept-Encoding: gzip,deflate,sdch
  Accept-Language: zh-CN,zh;q=0.8
  Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
  Cookie: ... ...

我们假定这个部分的长度为4960字节,它会被嵌在TCP数据包之中。

9.5 TCP协议

TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

9.6 IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

9.7 以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

9.8 服务器端响应

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。

本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

这个例子就到此为止,虽然经过了简化,但它大致上反映了互联网协议的整个通信过程。

(完)

留言(127条)

看过阮老师的互联网协议入门两篇文章,受益匪浅,上大学时候就一直好奇这个问题,问周围同学没人能讲得清楚,即使有的人真懂也不知道该怎么表达。直到今天才茅塞顿开,呵呵,发现每一个系统都是因为有了N多的保障才完好运行的,不容易啊,智慧是个好东西。

发现外专业来理解IT专业的很多事情确实还是挺困难的。那个0和1也比较让人纠结,不知是怎么个道理;还有比如一些漂亮的网页,那些图像啦颜色了是靠什么来规定的;再有N多不同种类的程序如何实现自己的功能……这些对我们单纯的使用者而言真的是极难搞懂的事情。

我网速好慢,不知道什么原因。

以前不太懂,网关和子网掩码的作用。现在明白了。因为整个网络是很庞大的,由不同的子网组成的。不同的子网之间是不能直接进行通信的,需要转发中转,这时候网关和子网掩码就要起作用了。我是这么理解的。

引用锐齿猱的发言:

我网速好慢,不知道什么原因。

网速慢有多种原因,最可能的是你使用的网络本来带宽就很小,比如1M。
另外,如果你开了很多要联网的软件,比如迅雷下载之类的,也会占用较多网速。

1:8.3 DHCP协议中“才能确定是不是发过自己的”是不是应该是“发给”
2:9.3 子网掩码中“做一个二进制的AND运算(两个数位相同,结果为1,否则为0)”括号中的解释应该是同或运算

插图是拿什么画的,好漂亮

引用reverland的发言:

插图是拿什么画的,好漂亮

看样子是著名的 Photoshop。

引用依云的发言:

看样子是著名的 Photoshop。

PPT也可以做出这种效果,其他专业图好像是office的visio做的。

受益匪浅。我读的不是相关专业,但对计算机,互联网都非常感兴趣,现在刚刚开始接触,正在学习编程,精力有限,开始时对技术的了解肯定有一定的局限性,希望阮老师可以写更多这类条理清晰,较容易理解的技术文章,对我们的帮助很大,感谢。我是读金融的,期待您有更多经济学方面的文章。

这篇文章有点白了,不过讲的不错哈

引用codebook的发言:

1:8.3 DHCP协议中“才能确定是不是发过自己的”是不是应该是“发给”
2:9.3 子网掩码中“做一个二进制的AND运算(两个数位相同,结果为1,否则为0)”括号中的解释应该是同或运算

谢谢指出,已经更正了。

阮老师的技术文章就是简洁明了!

阮老师的文章真好,以前是半懂不懂,看完后有点豁然开朗的感觉。

为什么你用window$?

9.8 服务器端的响应 google读出“HTTP请求”后,接着做出"HTTP响应",再用TCP协议发回来。
这个过程中,是不是先发到我所在子网络的网关,再通过网关发送到我的主机呢?希望阮老师能说详细点,不是很明白。

引用LUO的发言:

PPT也可以做出这种效果,其他专业图好像是office的visio做的。

是的,有很多软件都能够做出这种效果,所以看图的效果是得不到结论的。
如果不是伪造的信息的话,那些图是用 Photoshop CS5 Windows 版做的。

NICE啊,感谢大大的分享!!!

“当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发过我的",而其他计算机就可以丢弃这个包。”
还是有错别字,应为“这个包是发给我的”。
希望博主在发表文章之后,认真仔细得再读一遍。

数据包到了网关之后是怎么处理的呢? google服务器只能获取到外网ip,获取不到局域网ip 192.168.1.100

引用幽灵的发言:

还是有错别字,应为“这个包是发给我的”。

谢谢指出,已更正。

引用yava的发言:

数据包到了网关之后是怎么处理的呢? google服务器只能获取到外网ip,获取不到局域网ip 192.168.1.100

啊,我疏忽了,忽略了内外网IP地址转换的问题。

192.168.1.100这个例子举得不好,如果改成通用IP地址,就不存在转换问题,Google的服务器就能得到这个地址了。

因为这个问题涉及的地方比较多,要等到下一次修订本文的时候,我再一次性全部改掉。

能讲下IPv6的网络吗?

引用阮一峰的发言:

因为这个问题涉及的地方比较多,要等到下一次修订本文的时候,我再一次性全部改掉。

期待您的内外网地址转换的文章。

感谢,阮爷教诲!

受益匪浅

不能付费支持了?跳到支付宝“暂停担保买卖业务的公告”了

引用cpluse的发言:

不能付费支持了?跳到支付宝“暂停担保买卖业务的公告”了

改好了,跳转到支付宝个人收费主页了。

看过了1,就等着看2,呵呵~对我来说,1的内容深入浅出,非常不错!当然,2也不错~

呵呵,终于出来了。文章写得相当好,我存在我的为知笔记里了,地铁上没事的时候就拿出来看看。

看了阮哥的文章,才知道世界上的天才离我是那么的近,是那种触手可及的,而不是站在云端那种。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

+++++++++++
是不是也要加上ethernet包的head呢???应该是1500,1500,1500,640把

看来阮老师的博文,觉得原来零碎的互联网协议知识才有了一个整体的感觉。不过,可能是自己对协议的知识了解的只是一知半解,所有有些东西还要下去再用功!
期待阮老师内外网转换的文章!!

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。
第一篇文章中说如果不在一个网络内获取对方的MAC地址要交给网关处理,这个处理能解释一下么?还是有后续的文章

192.168.* 是保留地址,不允许在Internet上出现,一般用作内网。内网与外网之间可以通过NAT协议进行转换。
一个IP包从本地网络到达Google的服务器,中间需要经过多个路由器,而不是网关。

受益匪浅呀, 但是有个疑问.

我是一个在内网的接收方, 发送方要发送什么样的地址我才能收到呢? 因为在IP里面只有一个我的内网地址, 而以太包里面也只有我的IP. 内网IP在全球这么多个, 它是怎么找到我的呢? 肯定不是通过MAC来找的吧, 那么, 是不是每经过一个路由, 就会在里面再封装一层地址呢? 最终发送方发出的会不会是一串IP, IP, IP, IP, IP的链接呢?

写的真心不错,每一个地方都讲解的很清楚,还有一个地方没有讲清楚,还拿最后一个例子来说,“最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)”,发送到192.168.1.1,网关应该还会拆开包,根据子网掩码与操作发现不是在一个内网内,那么将会重新把这个包封装一下,接收方的为它的网关的MAC地址,就这样一层一层往上面找,最终到一个网关,网关根据子网掩码发现172.194.72.105(Google)和自己在一个内网内,然后将请求发给172.194.72.105(Google),这样就到达了目的地

简介明了,最主要的是成体系!

引用Leo的发言:

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。
第一篇文章中说如果不在一个网络内获取对方的MAC地址要交给网关处理,这个处理能解释一下么?还是有后续的文章

如果不在一个网络内是不需要获取对方MAC的,因为MAC地址适用于同一网段通信的。
需要的是网关的MAC,因为你要首先和网关通信。

今天在学计算机网络,特此温习了下。

讲得真精彩,受益匪浅!

讲得很清晰,虽然这些知识以前学计算机网络的时候都有学过,不过现在看完还是有种豁然开朗的感觉,相当不错!

你好!
很感激你整理出这么深入浅出的文章分享给大家!受益匪浅!

文中有一部分我有些不解,希望能获得一点指教!

文中讲到,以太网协议的时候,例中一个IP协议数据包要被分为4个包,但是每个包都需要有IP协议段。这一点是怎么做到的呢?是通过解析提取其中的IP协议段数据然后复制吗?我的疑问是下一层的协议不应该知道有高一层协议的存在,不应该为上一层负责,所以感觉不合理。


对此我的猜测可能的解释是,在实际中传输层协议实现的时候是直接负责数据打包成以太网数据包,所以整个过程在内部是清晰可见的,所以可以完成这个任务。

请问是那种情况使得他运转正常呢?希望能得到指教。

这两篇文章看下来,对整个互联网通信有个比较清晰的印象了。原来概念都很混乱,感谢老师写这么好的文章!

“根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。”

Google的服务器收到数据包的时候,它能得到所有路由中间过程吗?它收到的数据包中源IP地址和源MAC是我本机的呢,还是离它最近的那级网关的?怎么一级一级的发回来呢?


“……再用TCP协议发回来。” 这句话说的太简单了,谁给咱菜鸟讲解下?

真心清楚,阮老师,希望您能出一些IT方面的科普读物。

通俗易懂,太厉害了,由于不是该专业的,之前看了很多这方面的东西,都完全整明白,看完这篇有了一个整体框架,太爽了,多谢!!

引用阿Pon的发言:
9.8 服务器端的响应 google读出“HTTP请求”后,接着做出"HTTP响应",再用TCP协议发回来。这个过程中,是不是先发到我所在子网络的网关,再通过网关发送到我的主机呢?希望阮老师能说详细点,不是很明白。

应该也是经过了很多网关,但是不一定是和原来的路走相同的,最终达到了本地网关,网关然后转发给本地pc。

好文章,支持阮老师。

很适合我这样的菜鸟看啊!
建议多用些图解。

阮老师总是能把复杂的问题简化,讲的有条有理,来龙去脉都非常清楚,这样就什么容易记。

神教程,不解釋.果然是高手!
能把抽象的事物具象化,並且能夠讓普通人一看就明白,你絕對有當一個優秀導師的天賦.
感謝好文!

最近一直在研究阮老师的博客,因为大学的计算机课程基本上已经学完了,但是没有形成体系,很多东西都只能站在一个切面看问题,没有立体的看过,尤其是分层思想把握的不是很好,刚刚读完第三CSAPP,结合阮老师的文章,感觉对体系的认识逐渐在加深。我有一个想法:可不可以扩展你提出的Google的例子,然后从物理层到应用层进行更加详尽的分析和描述,从足够细致的角度来理解,因为自己在做另一件事情,就是解释简单的“Hello World”的从编译到OS到底层硬件的执行过程!

好文章,结合wireshark抓包,tcp/ip协议详解来学习,以前没有连贯起来。

之前单一的学习了各个部分的知识,很多东西知道了应该是什么,但为什么是这样,经博主把整个知识脉络串联起来,豁然开朗。

引用Kerry的发言:

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

+++++++++++
是不是也要加上ethernet包的head呢???应该是1500,1500,1500,640把

正要问这个问题呢,不过你的640是怎么算的呢? 我的理解是,以太网数据包中除去数据部分,还剩目的地址(6字节),源地址(6字节),类型(2字节)和FCS(4字节),一共6+6+2+4=18字节,分成4个就是4×18=72字节。 所以应该分成1500,1500,1500,50+72=122,对吗?

博主,你的博客为啥美誉目录呢,不好查找我想看的内容!

看了两遍,出去具体实现细节,头脑中已经有大致过程了

"以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560"


最后一个为什么是560不是500呢?想不通。。

很有意义,获益很大

谢谢,受益匪浅!

真是好文章,我真的很好奇,是怎么在短时间内,找到一个技术问题的本质与精髓的呢,难道是大量阅读?但是没有效率啊,一定有一些特别行之有效的学习方法,希望阮兄不吝赐教。

清晰易懂. 先点个赞.

关于DHCP服务器发送offer给client,貌似即可以广播也可以单播.

而且DHCPOFFER的目标IP地址,从我抓的wireshark trace来看, 貌似是新分配的IP地址,而不是文中的255.255.255.255.

阮老师的博文浅显易懂,受益匪浅,非常感谢分享!

写的通俗易懂!以前学过,现在重温一遍挺好的,新的收获是在DHCP过程,以前真的没分析过这个过程,以自动获取一笔带过了。感谢!

引用nian的发言:

"以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560"


最后一个为什么是560不是500呢?想不通。。

应该是500

引用codebook的发言:

1:8.3 DHCP协议中“才能确定是不是发过自己的”是不是应该是“发给”
2:9.3 子网掩码中“做一个二进制的AND运算(两个数位相同,结果为1,否则为0)”括号中的解释应该是同或运算

阮老师, 请问你平时都是如何接触, 学习, 熟悉新的知识的? 能否写一篇关于自我学习方面的文章, 谢谢!

经典

豁然开朗

好文章不会随着时间而流逝

峰哥,请收下我的腿

DNS服务端口不是53么?

计算机网络知识一窍不通,还是得慢慢补。。。。

引用iMusicDog的发言:

应该是500

是560。

5000的IP报文里已经包含1个IP头(20),分4次发,那么还需要3个IP头(60),共需要发5000 + 60 = 5060 = 1500 + 1500 + 1500 + 560

另外,以太网帧MTU指的是数据部分,不包括头

引用泡面搭档Ted的发言:

是560。

5000的IP报文里已经包含1个IP头(20),分4次发,那么还需要3个IP头(60),共需要发5000 + 60 = 5060 = 1500 + 1500 + 1500 + 560

另外,以太网帧MTU指的是数据部分,不包括头


好像确实有点问题。。。

1.IP数据包长度为5000字节 。
2.由于以太数据区最长为1500字节,然后拆分如下:
①20字节IP标头+1480字节的IP数据=1500
②20字节IP标头+1480字节的IP数据=1500
③20字节IP标头+1480字节的IP数据=1500
④20字节IP标头+560字节的IP数据=580
不知道这个对吗?
@阮一峰 如果回复可以有图片是不是好一点,或者网站上加一个用户注册功能:)

阮老师一语解疑惑;之前一直弄不明白;百度也各种迷糊;老师的思路清晰明了;

引用龙飞凤舞的发言:

好像确实有点问题。。。

1.IP数据包长度为5000字节 。
2.由于以太数据区最长为1500字节,然后拆分如下:
①20字节IP标头+1480字节的IP数据=1500
②20字节IP标头+1480字节的IP数据=1500
③20字节IP标头+1480字节的IP数据=1500
④20字节IP标头+560字节的IP数据=580
不知道这个对吗?
@阮一峰 如果回复可以有图片是不是好一点,或者网站上加一个用户注册功能:)


1. IP数据包长度为5000字节 = 20字节IP标头 + 4980字节的IP数据。
2. 由于以太数据区最长为1500字节,然后拆分如下:
①20字节IP标头+1480字节的IP数据=1500
②20字节IP标头+1480字节的IP数据=1500
③20字节IP标头+1480字节的IP数据=1500
④20字节IP标头+540字节的IP数据=560

阮老师讲的太好了 一晚上让我搞明白许多多年模糊不清的东西 很多知识虽然复杂 但如果真心实意想讲清楚还是有办法的 可惜现实中很多书和资料要么冠冕堂皇 生硬教条 七拼八凑 应付差事 要么讲到关键地方就不讲了 有时候关键的东西就几句话 或者举个例子能说明白 但他们就是不说 喜欢装 故弄玄虚 有意无意都要留一手 这不是少数 是大多数 这也许是人性或体制造成的… 所以阮老师这样的人真是太少了 既有学识又有真心 真的非常感谢和敬佩!!!

科普好文章。赞你!!

每天读一篇阮老师的文章 受益匪浅

我也觉得这个地方说的有点问题,但是我不明白的是:第一次连网,比如我带着笔记本去KFC蹭网,当我连上了KFC的wifi之后,就可以上网了,也就是DHCP会自动给我的笔记本返回一个ip地址,这个过程是不是瞬间完成的呢?还有请问下你是怎么用抓包看到返回的ip的呢?(或许我对连网的这个过程理解有误,还请指正!)

引用MG的发言:

清晰易懂. 先点个赞.

关于DHCP服务器发送offer给client,貌似即可以广播也可以单播.

而且DHCPOFFER的目标IP地址,从我抓的wireshark trace来看, 貌似是新分配的IP地址,而不是文中的255.255.255.255.

我也觉得这个地方说的有点问题,但是我不明白的是:第一次连网,比如我带着笔记本去KFC蹭网,当我连上了KFC的wifi之后,就可以上网了,也就是DHCP会自动给我的笔记本返回一个ip地址,这个过程是不是瞬间完成的呢?还有请问下你是怎么用抓包看到返回的ip的呢?(或许我对连网的这个过程理解有误,还请指正!)

阮老师,您好。两篇文章我翻来翻去的看,有一处不明白。
如何获得google服务器的网关MAC地址??

联通移动电信 在互联网中扮演什么角色?为什么要给他们缴费?他们是干啥的!网关吗?不通过这些公司就不能上网吗?

赞赞赞,讲的很好,通俗易懂

听君一席话,顿开茅塞。

Amazing! 非常清晰易懂!谢谢阮老师!

网站的IP地址可以通过DNS获取,那如果一台计算机想和另一台计算机通信(不是网站),怎么知道对方的IP地址呢?

引用前端_菜鸟的发言:

我也觉得这个地方说的有点问题,但是我不明白的是:第一次连网,比如我带着笔记本去KFC蹭网,当我连上了KFC的wifi之后,就可以上网了,也就是DHCP会自动给我的笔记本返回一个ip地址,这个过程是不是瞬间完成的呢?还有请问下你是怎么用抓包看到返回的ip的呢?(或许我对连网的这个过程理解有误,还请指正!)

是在网络设置里看么?你把网络关掉,网络设置里v4IP就变空了,再连上有能看到自己的IP了。

阮老师,首先非常谢谢你,看了你的这两篇感觉互联网整体通信理解了,非常谢谢你。
但是我还有一个问题不理解:
就是我们都说TCP协议的链接需要进行三次握手,这个我可以理解,就是tcp规定的嘛,为了保证通信的准确性(我是这么理解的),但是我不明白的是为什么tcp的链接的三次握手必须是客户端发起,原则上客户端和服务端不都是计算机嘛,根据博客讲的都可以发起的,都可以互相通信的,为什么到了这里就是必须是客户端发起通信啊? 这就让我想起来了我们平时说的长链接,如果不必须是客户端发起,要什么长链接啊,服务端也可以主动给客户端发。
希望阮老师能够帮我解答一下,谢谢

@梁炜东:

先有请求,才有客户端和服务端的定位。发送请求方为客户端,接受方为服务端。所以,你说的服务端发送,那么服务端我们就可以称之为客户端

阮老师说的任何东西都是易懂的,太厉害了!这对非科班出身的小白来说真是福音,谢谢!

引用东根的发言:

阮老师,您好。两篇文章我翻来翻去的看,有一处不明白。
如何获得google服务器的网关MAC地址??

我也纳闷

引用朱红枫的发言:

我也纳闷

ARD协议进行地址转化

吐个槽,不知道评论里为什么这么多人说通俗易懂的
只看出了大致过程,每个点都是点到即止,自己画个图在每个点都莫名其妙,这篇文章最多只能作为学成后的回顾来读吧,之前没看过网络的我是难以理解,也希望各位小白不要被评论带偏了,文章并没有那么通俗,回去先啃啃书再来吧

看到很多人都在想这个问题,我想应该是这样的
http数据包(4960)
-->TCP数据包(4980)
-->IP数据包(开始分割成4个包,每个包占标头20,4980+20*4所以总长5060)
-->四个以太网数据包:1500,1500,1500,560

读完您的这两边文章,真的是豁然开朗。

有一个疑问,当只知道对方网址,需要通过DNS服务器获取对方IP的时候,是需要往DNS服务器发送数据包,那么按照协议,以太网标头中的DNS服务器的MAC地址如何获取? 如果DNS服务器和当前PC在同一个网络可以根据ARP协议来获取?但若DNS服务器跟当前PC不在同一个子网络中呢,那如何往DNS服务器发送数据包来解析网址,也是要通过网关转发的吗? 小白一个,不知道问题提的是否恰当。

@梁炜东:

服务端和客户端是相对的,谁发起请求谁就是客户端,服务端也可以发起请求的。现在是我要向服务器请求数据,那么我就是客户端。

简洁明了 概括到位 受益匪浅 我会一直在这里学习下去的 谢谢阮老师!!

我只能说,震撼,我找了好久的都没找到这样一气呵成的。大多数文章都是分散的说各个层,没有串联到一起,根本不知所云。给跪,非常有帮助。

“DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方)”这里由DHCP响应回去的,接受IP不应该是0.0.0.0么,255.255.255.255是指的它本身?

阮老师:
你好,看过你的tcp协议,和互联网协议(一,二),总算是理通了请求的过程,现在有一个问题需要您来解答,您上边说的,不在同一个子网,不能使用ARP协议来获取对方的MAC地址,需要用到网关,我想问一下,另外一个网关是怎么获取到的,是通过ip获取的还是?希望您能回复。

引用w3c0929的发言:

看到很多人都在想这个问题,我想应该是这样的
http数据包(4960)
-->TCP数据包(4980)
-->IP数据包(开始分割成4个包,每个包占标头20,4980+20*4所以总长5060)
-->四个以太网数据包:1500,1500,1500,560

TCP数据头应该也要加到分片里面吧,不然后三个分片就没有TCP数据头信息了,我认为应该是4960+(20+20)*4 = 5120吧

阮老师的互联网协议入门两篇文章对网络协议初学者是一大贡献。本人近80岁,退休后一直学习数字电路,汇编语言,高级语言等。唯独网络协议感到很难理解,原因是以往那些网络协议的文章太专业,感谢阮老师的所做的贡献。

“经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。”
读到这里时,我脑海中想到的是西游记师徒四人终于到达西天的场景。某种意义上来说,取经也算是一次request/response吧

引用吴方波的发言:

阮老师的互联网协议入门两篇文章对网络协议初学者是一大贡献。本人近80岁,退休后一直学习数字电路,汇编语言,高级语言等。唯独网络协议感到很难理解,原因是以往那些网络协议的文章太专业,感谢阮老师的所做的贡献。

前辈这段话让晚辈更加坚定终生学习这个信念。

受益匪浅,特别是关于网关和IP地址的关系,讲的很通俗易懂

以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

之前只介绍了同一个子网下如何通过ARP协议得到MAC地址,那不是同一个子网下,如何通过ARP协议得到网关的MAC地址呢?

9.7 最后一个数据包应该是580字节吧

@juqkai:

IP header 有长度限制,不可能无限这么append 下去的,而且也不科学。

这一步是路由表维护的,你可以看看这个(路由拓扑):

https://docs.oracle.com/cd/E19683-01/806-4075/ipplan-1/index.html

讲的还是太浅了,ip报文头的结构,tcp报文头结构
三次握手,四次挥手这些都没讲。。只能说给完全不懂的人科普一下吧
另外最后一个例子里,ip头里面是没有数据包序号的
要把乱序的数据包按照顺序读取,是tcp协议要做的事情

“普通用户望而生畏,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,不够灵活”应该还有一个更重要的原因,是ipv4数量不够用了

非常感谢这两个帖子!通俗易懂!

有两个问题。
同个子网内把包广播,每个网卡都能收到这个包,那是如何保证信息的安全?
会不会存在子网掩码andip后相同,但事实上并不在同一个子网的情况。

引用沉默的发言:

TCP数据头应该也要加到分片里面吧,不然后三个分片就没有TCP数据头信息了,我认为应该是4960+(20+20)*4 = 5120吧

是的,我也一直想不明白这个包的算法,我也觉得应该是5120,因为还有端口数据呢(tcp标头)。或者有什么我们不知道的内部处理机制吧,这4个包有关联机制,不然,其他3个没有端口的包怎么发到服务器呢?

@龙飞凤舞:

第一个标头的20已经属于5000之内了,需要拆分的数据是3500,接下来的每一个包只能装1480,那就是 1500 + 1480 + 1480 + 540 = 5000

9.7 以太网协议
最后一句话“四个包的IP数据包的长度分别为1500、1500、1500、560”,我觉得四个包的长度应该分别为1500、1500、1500、580.

讲的非常好!
很难想象,这么复杂的流程,会在毫秒级别,完成一次http通信,真的太神奇了。

引用codebook的发言:

9.3 子网掩码中“做一个二进制的AND运算(两个数位相同,结果为1,否则为0)”括号中的解释应该是同或运算

进行的是AND运算,因为子网掩码的确定网络部分的位值都为1,所以才说相同为1,否则为0.

复习(预习)计网想先理清整体结构层次,就想找一个例子,刚好看到这篇!真的好

自己以前没怎么系统学习过网络方面的知识 正准备看书学习下 发现了阮老师的两篇文章 用心读了下写的真好! 算是入个门,加油。

写得太好了,看这么一个教程等于看了好几遍大部头

google给响应的时候是怎么找到我们的电脑的呢?是请求时就建立好连接了吗?

阮老师写的很明了,另外这部分要结合上一篇一起来看,我的理解是这样的
还是那个本机与google通信的例子,知道本机的mac地址和google的ip地址那么
* 本机-->本机的网关-->google的网关
* 从google网关里面根据ARP协议找到172.194.72.105对应的mac地址之后就实现了通信

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方)
------
接收方IP地址 255.255.255.255 应该是真实的IP地址。因为IP地址已经给分配好了

这才是学问,循序渐进。上课上来七层模型 怎么来的一概不说 搞得似懂非懂的。现在的某些大学教育是大问题

太受用啦感谢大神

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接