热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络通信基础:互联网协议(IP)详解

互联网协议(IP)作为TCP/IP协议栈的核心组成部分,主要负责提供一种无连接且不可靠的数据包传输服务。这意味着IP并不确保数据包能够成功抵达目标地址,而是尽力而为地进行传输。此外,IP协议在数据传输过程中不维护任何连接状态,每个数据包独立处理,确保了网络的高效性和灵活性。

一、简介

    IP是TCP/IP协议族的核心协议。IP提供不可靠、无连接的数据报传送服务。

    不可靠的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。任何要求的可靠性必须由上层来提供(如TCP)。

    无连接的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。

二、IP首部

    IP数据报格式如下图所示,IP首部长为20个字节。


    如上图所示,最高位在左边,记为0bit,最低位在右边,记为31bit。

    4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称为大端字节序。其也可成网络字节序。在网络上传输数据前,需将首部转换为网络字节序。

    协议版本号为4时代表IPv4。首部长度是指首部占32bit字的数目,包括任何选项。由于它是一个4bit字段,因此首部最长为60个字节。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。详细介绍见书中的P25。

    总长度字段是指整个IP数据报的长度,以字节为单位。利用首部长度和总长度字段,就可以知道IP数据报中数据内容的其实位置和长度。由于此字段长16bit,所以IP数据报最长可达65535字节。

    标识字段唯一的标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。

    TTL生存时间字段设置了数据报可以经过的最多路由器数。TTL初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1.当该字段值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。

    首部检验和字段是根据IP首部计算的检验和码。它不对首部后面的数据进行校验。ICMP、IGMP、UDP和TCP在他们各自的首部中均含有同时覆盖首部和数据的校验和码。校验和主要采用16bit的反码求和方式进行。

    源IP地址和目的IP地址都是32bit的IP值。

三、IP路由选择

    如果目的主机与源主机直接相连(如点对点连接)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机。否则,主机把数据报发往一个默认路由器,由路由器来转发该数据报。大多数主机采用这个种简单机制。
    IP层可以配置成路由器的功能,也可以配置成主机功能。
    IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次,当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或是IP广播地址,如果是,数据报就被送到由IP首部协议字段所指定的协议模块进行处理,如果IP数据报的目的地址不是这些,那么如果IP层被设置为路由器的功能,那么就对数据报进行转发,否则数据报被丢弃。

    IP路由选择是逐跳地(hop-by-hop)进行的。从这个路由信息可以看出,IP并不知道到达任何目地的完整路径(除了那些直接相连的目的)。所有的IP路由选择只为数据传输提供一下站路由器的IP地址。

    IP路由选择主要完成以下这些功能。

    1、搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)
    2、搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于路由表中的标志字段值)。目的网络上的所有主机都可以通过这个表目来处决。例如,一个以太网上的所有主机都是通过这个表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。
    3、搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
    4、如果上面这些步骤都没有成功,那数据报就不能发送。如果不能发送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。
    完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。默认路由以及下一站路由器发送的ICMP间接报文是IP路由选择机制中功能强大的特性。为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择的另一个基本特性,这样做可以极大地缩小路由表的规模。
    一般IP的路由选择过程如下:
    1、主机和路由器都是用了默认路由;
    2、数据报中的目的IP地址始终不发生任何变化;
    3、每个链路层可能具有不同的数据帧首部,而链路层的目的地址始终指向下一站的链路层地址。
    即 每当数据包发出后,IP头中的目的IP地址始终不会改变,改变的是链路层首部的目的地址(即MAC地址),MAC地址指向的始终是下一部路由的MAC地址(其中使用了ARP地址解析协议)。数据到达下一路由后在路由表中进行搜索,以确定下一部是否为目的地。如下一站地址是IP头部中的目的地址,则数据被传送到目的地。如最终找不到与IP头部中的目的地址相匹配的地址,则数据包被丢弃(数据的路由跨越是由TTL值指定的)。
四、子网寻址
    所有的主机都支持子网编址,不是把IP地址看成由单纯的一个网络号和主机号组成,而是把主机号再粉城一个子网号和一个主机号。子网的划分缩减了路由表的规模。子网对于子网内部的路由器是不透明的。
五、子网掩码
    主机除了配置主机IP地址外,还需要知道有多少比特用于子网号及多少比特用于主机号。这是引导过程中通过子网掩码确定的。掩码是一个32bit 的值,其中值为1的bit留给网络号和子网号,为0的比特留给主机号。
    给定IP地址和子网掩码后,主机就可以确定IP数据报的目的是:
    (1)本子网上的主机;(2)本网络中其他子网中的主机;(3)其他网络上的主机。
    知道本机IP地址,就知道是A类、B类或者C类地址(从IP地址的高位就可以得知),也就知道网络号和子网号之间的分界线,进而根据子网掩码也就知道子网号和主机号之间的分界线。
六、ifconfig命令
    ifconfig -a,查看当前所有子网接口的有关参数。可通过ifconfig后接网络接口名+IP地址+netmask+子网掩码来设置本机相应网络接口的基本IP地址和子网掩码。
七、netstat命令
    netstat命令也提供系统上的接口信息。-i参数打印出接口信息,-n参数则打印出IP地址,而不是主机名。
    此命令打印出每个接口的MTU、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度等信息。


推荐阅读
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文详细解释了华为ENSP模拟器中常用的命令,涵盖用户模式、系统模式、接口模式和地址池视图模式下的操作。这些命令对于进行计算机网络实验至关重要,帮助用户更好地理解和配置路由器及PC机的通信。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 本文深入探讨了计算机网络的基础概念和关键协议,帮助初学者掌握网络编程的必备知识。从网络结构到分层模型,再到传输层协议和IP地址分类,文章全面覆盖了网络编程的核心内容。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
author-avatar
bb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有