热门标签 | 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、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度等信息。


推荐阅读
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • NTP服务器配置详解:原理与工作模式
    本文深入探讨了网络时间协议(NTP)的工作原理及其多种工作模式,旨在帮助读者全面理解NTP的配置参数和应用场景。NTP是基于RFC 1305的时间同步标准,广泛应用于分布式系统中,确保设备间时钟的一致性。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • CentOS系统安装与配置常见问题及解决方案
    本文详细介绍了在CentOS系统安装过程中遇到的常见问题及其解决方案,包括Vi编辑器的操作、图形界面的安装、网络连接故障排除等。通过本文,读者可以更好地理解和解决这些常见问题。 ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
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社区 版权所有