草庐IT

【操作系统】十分钟了解关于TCP/IP网络的基础知识(二)ARP、路由器、DHCP、DNS以及TCP/IP

性感博主在线瞎搞 2025-04-08 原文

承接上篇文章(十分钟了解关于TCP/IP网络的基础知识

五. ARP(地址解析协议)

         虽说使用IP地址确实方便了我们使用者记忆以及整理归类、寻找信息的发送目的地,但是最终接收数据的地方,还是MAC地址,于是乎,为了实现有IP地址到MAC地址的转换,引入了名为ARP(Address Resolution Protocol)又称之为地址解析协议

       ARP通过广播(Broadcast,这是个专业名词,后面还会继续提起)的方式对LAN中所有的计算机提问:“哎,谁IP地址是10.165.7.116(上篇文章中的例子)呀?你MAC地址多少啊,快过来登记一下!”,如果有哪台计算机回复了MAC地址,那么IP地址和MAC地址的对应关系也就明确了。

       但要是每次临到要用的时候在进行广播询问,那么查询的效率就会降低,所以ARP提供了缓存的功能,提前向各个计算机广播一遍并且存储起来,这种存起来的对应关系信息称之为“ARP缓存表”,我们可以使用arp  -a 命令来查看保存在本地的ARP缓存表:

六.路由器的作用

         在一个LAN中,IP地址中的网络部分就可以代表了这个LAN的全部计算机,而路由器就是将多个LAN连接器形成一张大网(也就是传说中的互联网)

        我们来设想一下,当一个LAN(举例为A)内计算机想把数据发送给另外一个LAN(举例为B)的计算机时会发生什么呢(如果是发送给本LAN的就不用经过路由器了)?可以肯定的是,发送数据时会把LAN(举例为B)的IP地址也附加上,发送到路由器那去,而路由器通过解析数据上的IP地址了解到数据是发往互联网的,就把它发送到LAN外去(此乃路由器的工作原理)。但像互联网这种传输路径错综复杂的网络,路由器是怎么知道数据要传到哪里的呢?

                                           路

       神奇的是路由表会记录通往与之相邻的路由器路径,并不会记录全世界访问的所有传输路径,要是路由表没有找到,就从相邻的路由表那里找,一步一步到达目的地:

我们可以通过指令route print来查看路由表:

PS:图上的跃点数可以理解为权重,由某个算法决定,比如数据传输过程中经过的路由器数量。如果遇到多条候选路径都可以通往目的地的情况,路由器就会选择跃点数较小的那条路径。

PSplus:使用tracert 指令可以查看路由器的路由过程:

       如图上指令所示,为了跟踪寻找到www.baidu.com 的ip地址,从第一行一直到第十三行,都是所搜索过的IP地址,到了11次终于到达了目标地址。

七.DHCP服务器的作用

   

         图上的设置虽说可以手动设置IP地址以及子网掩码,但是大多数情况下还是会选择“自动获得IP地址”,这个选项会让计算机在启动时就从DHCP(Dynamic Host Configuration Protocol)又称动态主机设置协议服务器中获取到IP地址和子网掩码,并自动配置

       DHCP服务器上记录着空余可以被分配到LAN内计算机的IP地址范围和子网掩码的值。作为DHCP客户端的计算机在启动时,就可以从中知道那些IP地址还没有分配给其他计算机。

八.DNS域名系统服务器

        上个例子的图中还可以看到一项“自动获得DNS服务器地址”,其中的DNS(Domain Name System)又称之为域名系统服务器,其作用在于把主机名解析成IP地址。我们可以用ipconfig  /all来获取到主机名和域名:

        如图中所示,“ma50j”是主机名,“yzw.co.jp”是域名,所以完整的域名就叫做“ma50j. yzw.co.jp”。我们在互联网的实际使用中,其实并不会直接使用到IP地址、MAC地址这种这么直接的数字来表达,反而是使用一些类似于www.baidu.com这种域名,再通过DNS服务器解析成IP地址。DNS服务器和前面说过的路由表一样被部署在LAN中,记录着IP地址和域名之间的关系,如果一个DNS服务器无法解析域名,就会通过其他LAN的DNS服务器来询问解析

       通过使用指令我们可以查看到域名和ip地址之间的关系:

         如图上所示,通过搜索可以查到www.baidu.com的IP与域名之间的关系。

九.TCP/IP网络的层级模型

       我们经常可以看到TCP/IP协议这个专业名词在网络基础知识之中,IP协议用于指定数据发送目的地的IP地址以及通过路由器转发数据而TCP协议则通过数据发送者和接收者相互回应对方发来的确认信息,进而安全地传输数据,像这种数据传输方式通常称之为“握手”:

         TCP协议中规定,发送者要把原始的大数据分割成以“包”为单位的数据单元发送,接收者通过把“包”拼装在一起还原出原始数据(其实还会附加各种各样的验证信息)

         硬件上发送数据的是网卡。在网卡之上是设备驱动程序(用于控制 网卡这类硬件的程序),设备驱动程序之上是实现了 IP 协议的程序,IP 程序之上则是实现了 TCP 协议的程序,而再往上才是应用程序:

         TCP 协议使用被称作“TCP 端口号”的数 字识别上层的应用程序。TCP 端口号中有一些是预先定义好的,比如 Web 使用 80 端口,电子邮件使用25端口(用于发送)和110端口(用于接收)。

PS:推荐大家看一下《计算机是怎么跑起来的》这本书,这两篇文章都是这本书做的笔记

有关【操作系统】十分钟了解关于TCP/IP网络的基础知识(二)ARP、路由器、DHCP、DNS以及TCP/IP的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  5. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  6. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

随机推荐