zoukankan      html  css  js  c++  java
  • 主机地址linux网络编程之TCP/IP基础(二):利用ARP和ICMP协议解释ping命令

    本篇文章朋友在深圳吃饭的时候突然想到的...最近就有想写几篇关于主机地址的博客,所以回家到之后就奋笔疾书的写出来发布了

        一、MTU

        以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分离是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)
    如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要停止分片(Fragmentation),把数据报分红若干片,这样每一片都小于MTU。
    当网络上的两台主机互相停止通信时,两台主机之间要经过多个网络,每个网络的链路层可能有不同的MTU,其中两台通信主机路径中的最小MTU被称作路径MTU,Internet上标准MTU为576B

        

        二、以太网帧格式

        主机和地址

        其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部份就是硬件地址。协议字段有三种值,分离对应IP、ARP、RARP。帧末端是CRC校验码。
    以太网帧中的数据长度划定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。ifconfig命令的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。

        

        三、ARP(address resolution protocol)

        在网络通讯时,源主机的应用程序晓得目的主机的IP地址和端口号,却不晓得目的主机的硬件地址,而数据包首先是被网卡接收到再去处理下层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须取得目的主机的硬件地址。ARP协议就起到这个作用。源主机收回ARP请求,询问“IP地址是10.0.0.1的主机的硬件地址是多少”,并将这个请求广播到当地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机符合,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。如下图所示

        主机和地址

        每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时光(一般为20分钟),如果20分钟内没有再次应用某个表项,则该表项失效,下次还要发ARP请求来取得目的主机的硬件地址。

        主机和地址

        注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各涌现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有多是须要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分离为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。

        

        地址解析协议的处理流程如下图:

        主机和地址

        

        每日一道理
    无知者为梦想中的虚幻而苦苦等待,换回的不是所求的,而是岁月在脸上留下的印痕,一事无成的人一生便是虚度。生活中,与其花时光去等待,不如加快步伐去追寻理想,试着与时光赛跑,也许身躯、心理会感到劳累,但这样的生活毕竟是充实的。

        四、RARP(Reverse Address Resolution Protocol)

        跟ARP相反的协议,重要用于获取无盘工作站的ip地址,如下图所示,不再赘述。

        主机和地址

        

        五、ICMP(Internet Control Message Protocol)

        ICMP协议用于传递差错信息、时光、回显、网络信息等控制数据,如下图所示。

        主机和地址

        ICMP报文是封装在IP数据报文中停止传输的,如下图所示。

        主机和地址主机和地址

        具体的类型和代码见下图。

        主机和地址主机和地址

        

        六、利用ARP和ICMP协议解释ping程序

        先看下面的流程图,再来解释。

        主机和地址

        

        步调a:应用程序ping会判断发送的是主机名还是IP地址,如果是主机名会调用函数gethostbyname()解析主机B,将主机名转换成一个32位的IP地址。这个过程叫做DNS域名解析。
    步调b:ping程序向目的IP地址发送一个ICMP的ECHO包
    步调c:将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址。
    步调d:主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A。
    步调e:发送ICMP数据包到主机B。
    步调f:主机B接收到主机A的ICMP包,发送响应包。
    步调g:主机A接收到主机B的ICMP包响应包。

        

        

        参考:

        《Linux C 编程一站式学习》

        《TCP/IP详解 卷一》

    文章结束给大家分享下程序员的一些笑话语录: 自从有了Photoshop,我再也不相信照片了!(没有Photoshop的年代,胶片照片年代做假的也不少,那时候都相信假的!)

    --------------------------------- 原创文章 By 地址和硬件地址 ---------------------------------

  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3095772.html
Copyright © 2011-2022 走看看