但信件邮寄到目的地址后由谁来收?从上面这封信的收件人地址检索到这个地址是“沈阳大学”的,沈阳大学里可能住着几万人,那你这封信是邮寄给居住沈阳大学里的那我的的?收件人不明确,邮局就算帮你把信件送到这个地址,也没办法帮你投递到具体的收信人。缓存
所以,咱们邮件信件须要填写“收件人姓名”、“收件人地址”和“寄件人姓名”、“寄件人地址”的组合,这样才能保证信件能准确投递到具体的收件人手中。服务器
因此咱们要在信件上添加收信人姓名和寄信人姓名(由此引入端口号),这个时候收件人姓名就对应数据包里TCP协议头部中的目的端口号,寄信人姓名对应数据包里TCP协议头部中的源端口号。微信
咱们再来对比传递信件与传递数据包的过程:网络
1.首先是位于南宁的李小明给沈阳的王小花经过QQ发送了一条消息,李小明的电脑将此消息打包成TCP数据包发送到计算机网络中,计算机网络经过数据包中的目的IP地址把该数据包准确传递到王小花的电脑。工具
由上面的例子咱们还能够引伸出数据包结构中的其余字段的做用,例如咱们收到信后能够简单地经过信封是否完整来检查该信件是否被别人在传输途中拆开并篡改过信件内容,那么咱们怎么保证咱们收到的数据包里的数据有没有在中途被别人拆开修改过呢?数据包结构中有一个字段叫TCP校验和就是专门作这个工做的。由数据包的字段能够看出,不少字段都有其用处,只是咱们一开始学的时候不必学的那么仔细而已。学习
必定要形象地理解数据包,简单的想一下,计算机网络不就是帮助咱们传递信息的吗?对于邮寄信件来讲,信息的载体是信纸和信封,那计算机网络中信息的载体是什么?就是各类类型的数据包啊! 数据包里有咱们关心的信息,也有咱们不关心的花销,咱们要学的就是如何使网络按照咱们的要求传递信息。例如,咱们邮寄信件,有平信,有挂号信,根据不一样的应用场景选择不一样的邮寄方式。计算机网络里信息传输也是同样,针对不一样的场景使用不一样的协议, 有些场景须要多种协议同时配合使用。 动画
上面那个QQ的例子不太严谨,由于QQ和微信的信息都是经过腾讯服务器中转的,但你是初学者不必一开始就深究这些细节,总之要学会把一切抽象的东西都对照生活中的一些场景使之形象化。这样你的学习过程就不会那么枯燥乏味了。spa
再来看一下为何须要网络协议,咱们看下图的简单类比:计算机网络
从上图能够看出,咱们邮寄信件只是想要把咱们写在信纸信息传递出去,对于咱们来讲,邮寄信件须要购买信封和邮票,这对于咱们来讲是没有意义的,甚至咱们会以为连信纸都是多余的,由于还要购买信纸,咱们只是想传递信息而已,信封、邮票和信纸对于咱们来讲是传递信息的额外花销,可是没有这些花销,你的信息就没法经过邮局传递。同理,在计算机网络里也是同样的,咱们的经过计算机网络传递信息也须要额外的花销,这些花销体如今计算机网络里就是TCP/IP的各类协议数据包的头部(除去应用层数据以外的其余信息)。设计
你要知道计算机网络里的数据交换都是像咱们平常邮寄信件同样经过各类的数据包来传递的,理解了数据包的做用以后你就应该开始学习计算机网络是如何把数据包传输到目的地的?例如咱们的电脑在生成数据包时是怎么知道对方电脑的ip地址的,(由此引入DNS)?咱们的信件是最开始是经过邮局帮咱们邮寄的,那么咱们的电脑的数据包应该由谁来帮咱们传输呢?(由此引入网关),网关又是如何帮咱们把数据包传输到目的地的?(由此引入各类路由协议)。
因此,你想要学习网络协议,就要先把一些基本的协议的做用和工做过程搞清楚,网络设备还没智能到人脑的程度,它是由人类创造出来的,它的工做过程确定是符合人类的交流习惯,按照人类的交流习惯来设计的。因此要以人类的思惟方式去理解这些协议。例如,你给别人打电话,不可能电话一接通你就啪啦啪啦地说一大通,万一对方接通电话后由于有事还没来得及倾听呢?这不太符合正常人类的交流习惯。通常是电话接通后,双方通常会有个交互的过程,通常是你说一声“你好”,而后对方也回复一声“你好”,双方经过各自一句“你好”明确对方的注意力都放在了电话沟通上,而后大家双方就能够开始交流了,这才是正常的人类交流方式,这个过程体如今计算机网络里就是网络协议!咱们经过TCP协议在两台电脑创建网络链接以前要先发数据包进行沟通,沟通后再创建链接,而后才是信息的传输。而UDP协议就相似于咱们的校园广播,广播内容已经经过广播站播放出去了,你能不能听到,那就与广播站无关了,正常状况下,不可能你说没注意听而后再让广播站再播放一次广播内容。
同理,咱们来看一下网络广播,对于某一个网络的网络广播,只要发送一个网络广播包,这个子网里的全部电脑都能收到这些广播包,这是一个很方便的通知机制,可是会增长对广播数据不感兴趣主机的处理负荷。相似咱们的校园广播,校园广播一开启播放,校园里的全部人都能听到,可是不是全部人都对广播内容感兴趣,有些人选择倾听,有些人选择忽略。但无论你是倾听仍是忽略,广播的声音都会传到你的耳边。例如,校园广播一条失物招领通知,你根本没丢东西,因此这个广播内容与你无关,可是广播的声音仍是会传到你的耳边。对比广场舞音乐,对于跳广场舞的大妈大婶来讲,这就是音乐,对于想睡觉的您来讲,这就是噪音。
怎样才能更好地理解常见的网络协议?学习网络协议就是要先学习它的工做过程,例如DHCP协议,协议大概是这样讲的:启用了DHCP协议的电脑启动后便会发送广播数据包网络中寻找DHCP服务器,若是网络中有DHCP服务器,这台DHCP服务器便会发送广播数据包与你的电脑进行响应。
这个过程很简单,就是我想要获取ip地址,而后你给我提供一个。想象一下若是你是DHCP协议的设计者,你会考虑到在ip获取和分配过程当中会有哪些特殊状况呢?
第一种,若是在你启动电脑的过程当中网络中的dhcp服务器恰好宕机了,这时怎么办?让你的电脑一直徒劳地发送寻找DHCP服务器的广播包吗?仍是在发现没有DHCP服务器与你响应后就不再发了?仍是每隔一段时间就再发送一次寻找DHCP服务器的广播包?
第二种,若是DHCP服务器的可用ip地址恰好已经分配完了,那又怎么处理?
第三种,若是网络中同时有两台以上的DHCP服务器,那又该怎么处理?
第四种,对于已经分配出去的ip地址就这么一直保持分配出去的状态吗?仍是要回收?若是要回收?是我去问你还要不要使用这个ip地址?仍是我设定一个回收的时间?只要你在这个时间段内你没有再次联系我从新获取这个ip地址我就把它回收?等等。。。
经过这样的思考你能够发现,网络协议其实也是按照人的思惟方式在工做,可是网络设备不会像人同样思考,因此咱们当初给它设计各类协议的时候就要尽量地为它想到这些协议所要应对的场景。例如,你能够先学习ARP协议的工做过程,而后再百度搜索ARP攻击是怎么回事?就是利用ARP协议设计的不严谨,伪造ARP数据包篡改网络里其余电脑的ARP缓存列表。ARP协议采用广播发送协议数据包,这就致使里网络里的每一台电脑都会收到ARP的协议数据包,而ARP协议规定即便你的电脑没有发出arp请求,只要有ARP回应包到达你的主机,你就要对这些协议包进行处理,并将回应包中的mac和ip对应关系放入本身的arp缓存。若是ARP回应包里面的网关IP与ARP对应关系是正确的,这个问题不大,但若是有人在网络中伪造了错误的网关IP与ARP对应关系并广播到网络里,那就出问题了,你可能也意识到你上不了网是由于网关IP对应的ARP对应关系出错,可是没有办法,由于你的电脑上运行的ARP协议规定,你的电脑必需要接受这个错误的对应关系,这就是网络协议设计的不严谨,设计和实现ARP协议的时候没有想到竟然会有人在网络中伪造ARP回应包并广播到网络中。
若是你看《TCP/IP详解》这套书以为很吃力,那就建议暂时不要看了,强烈建议你先看《计算机网络自顶向下方法与Internet特点》这本书,这本书对常见的网络协议的工做过程进行了分析,可读性很强,看起来比《TCP/IP详解》轻松多了,了解了常见协议的工做过程你就能够动手作实验来验证这个协议的工做过程了,建议先使用模拟器来作实验,像cisco packet tracer 就很好用,它有个模拟功能能够像看动画同样看到网络数据包是如何在网络拓扑结构中传输和交互的,对了解协议的工做过程很是有用,还有抓取数据包的功能,能够抓去指定协议的数据包进行查看。
使用真实设备经过在电脑上安装抓包工具进行抓包也能够,只不过没有模拟器上看得那么直观,对于初学者仍是建议先以模拟器作实验为主,由于你能够很直观地观察你所设计的网络的运行状况,更容易把心放在学习网络协议的工做过程上。