小白学TCP/IP(四)IP协议篇

2024-04-25 23:48
文章标签 ip 协议 tcp 小白学

本文主要是介绍小白学TCP/IP(四)IP协议篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IP协议篇

网络层与数据链路层之间的关系

网络层负责端到端之间(消息发送端与消息接收段)的通信,但至于中间消息是怎样被转发的,得通过数据链路层实现,也就是说数据链路层负责每个数据链路从源MAC地址到目标MAC地址之间的数据传输,而网络层则是规定了数据最开始的发送端和最终的接收端.

把这个过程比喻成快递运输,假如我在北京要发送一个快递到武汉市华中科技大学机械大楼,IP层完成的任务就是在快递单上写上寄件人地址和收件人地址(源地址和目的地址)和其他信息,然后贴到快递包裹上,然后快递点通过一张规定好的快递传输信息表(比如目的地为武汉,则直接发送到郑州快递中转站),这张信息表在网络传输中叫做路由控制表,这样快递就从寄件人----北京----郑州中转站----武汉总站----华中科技大学站----华中科技大学机械学院----收件人手中,其中北京到郑州中转站之间的传输即为数据链路层的传输,只负责从一个中转点运输到下一个中转点(数据链路层的主要作用是在互联同一种数据链路的节点之间进行包传递)

IP协议为什么是面向无连接的

IP面向无连接,在发包之前不需要建立与对端目标地址之间的连接,将这个功能实现委托给了TCP层去实现.

  • 为了简化,面向连接比起面向无连接处理相对复杂.
  • 为了提速,面向连接每次通信之前都要建立连接,会降低处理速度.
  • 分层实现不同的功能,IP只负责将数据发给目标主机,而TCP负责保证对端主机确实接收到数据.每一层的分工明确,简化协议的实施与编程,有利于协议今后的扩展和性能优化.

IP地址分类

IP地址(32位)分为四个级别,分别是A类,B类,C类,D类.

A类地址
首位以0开头,从第1位到第8位是它的网络标识
十进制表示: 0.0.0.0~127.0.0.0是A类的网络标识,后24位用于主机标识
一个网段可容纳主机地址上限为:16,777,214个
B类地址
首位以10开头,从第1位到第16位是它的网络标识
十进制表示: 128.0.0.0~191.255.0.0是A类的网络标识,后16位用于主机标识
一个网段可容纳主机地址上限为:65,534个
C类地址
首位以110开头,从第1位到第24位是它的网络标识
十进制表示: 192.0.0.0~223.255.255.0是A类的网络标识,后8位用于主机标识
一个网段可容纳主机地址上限为:254个
D类地址
首位以1110开头,从第1位到第32位是它的网络标识
十进制表示: 224.0.0.0~239.255.255.255是A类的网络标识,没有主机标识,常被用于多播.

补充知识:
主机标识位上不可以全是0或者全是1,这两种情况有特殊用处
全是0代表对应的网络地址或IP地址不可获知的情况
全是1的主机地址通常被作为广播地址

子网掩码

引入子网后,IP地址就有了两种识别码,一个是IP地址本身,一个是表示网络部的子网掩码

子网掩码的作用: 将IP地址划分为更小粒度的网络,而不再受限于ABCD类地址划分方式.

子网掩码的构成: 采用32位二进制表示,对应IP地址网络标识部分的位全部为"1",对应主机标识部分的位全部为"0".

子网掩码的两种表示方式:
以172.20.100.52的前26位为网络标识为例

  • IP地址:172.20.100.52 子网掩码:255.255.255.192
  • IP地址:172.20.100.52/26(直接在IP地址后面追加网络地址的位数,用"/"隔开)

路由控制

路由控制表的作用:
发送数据包所使用的地址为网络层的地址(IP地址),但是仅仅有IP地址无法完成将数据包传输到对端目标地址,因为中间可能存在很多数据链路.在数据发送过程中还需要指明路由器或主机的信息,保存这种信息的就是路由控制器.

路由控制表的形成方式:

  • 静态路由控制:由管理员手动设置
  • 动态路由控制:路由器与其他路由器相互交换信息时自动刷新

路由控制转发的原理:

前提: 路由控制表中记录着网络地址和对应的下一步应该转发的路由器的地址.

在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发至对应的下一个路由器(如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址,即相同位数最多的网络地址,例如172.20.100.52的网络地址与172.20/16和172.20.100/24两项都是匹配的,但是172.20.100/24是最吻合的,应该转发到该地址对应的路由器.

补充知识:
环回地址:环回地址是在同一台计算机上不同程序之间进行网络通信所使用的默认地址,即127.0.0.1,也可以用localhost来代替,使用该IP时,数据包并不会流向网络.

IP分割处理与再构成

每种数据链路的使用目的不同,所以可承载的MTU也不同

为何需要将IP报文分割
每个数据链路的最大传输单元(MTU)不尽相同,一旦IP报文的大小比数据链路中最小的MTU大的时候,就会发生IP报文分割,也就是分片.(可以理解为数据链路的运输能力不够,只能将单个报文分割成多个报文运输)

为何经过分片后的IP数据报的重组只能由目标主机进行
如果在中途重组,有可能在之后又面临分片的尴尬处境,这会给路由器带来多余的负担,也会降低网络传输效率.

路径MTU发现

路径MTU:是指从发送端主机到接收端主机之间不需要分片时最大的MTU大小,也就是路径中所有数据链路中最小的MTU.

路径MTU发现原理:

  1. 首先源地址将数据报的分片标志位设置为不分片,并将IP数据报发送出去
  2. 路径上任何需要将分组进行分片的设备都会将这种数据报丢弃并返回“数据报过大和当前数据链路允许的最大MTU“的ICMP响应到源地址
  3. 源地址主机将IP分片,并重新设置最大MTU,再次将IP数据报发送出去
  4. 不断探索发送直到不再收到ICMP响应,这样源主机就”学习“到了无需分片就能通过这条路径的最大的最大传输单元。
    [外链图片转存失败(img-fi9yRcRw-1565752177829)(https://raw.githubusercontent.com/zrysmt/mdPics/master/HTTP协议/tcp-ip/12.png)]

IPv4首部

IP首部中包含用于IP协议进行发包控制时所有的必要信息

属性大小(比特)作用举例(补充说明)
版本4标识IP首部的版本号IPv4的版本号为4
首部长度4表明首部的大小,单位为4字节(32比特)没有可选项时,首部长度设置为5,即IP首部长度为4*5=20字节
区分服务8表明服务质量基本被所有网络无视,没有投入使用
总长度16IP首部+数据部分的总字节数IP包的最大长度为65535(=2的16次方)字节
标识16用于分片重组单个IP数据报被分割后的分片,该标识相同
标志3表示包被分片的相关信息第1个比特未使用,目前必须为0,第二个比特表示是否分片,第三个比特表示被分片的情况下是否为最后一个包
片位移13标识被分片的每一个分段相对于原始数据的位置第一个分片对应的值为0
生存时间8可以中转多少个路由器每经过一个路由器,TTL减1,变为0则丢包,可以避免IP包在网络内无限传递
协议8表示IP包传输层的上层协议编号TCP编号为6,UDP编号为17
首部校验和16校验数据报的首部,确保IP数据报不被破坏
源地址32表示发送端地址
目标地址32表示接收端地址

IPv6

IPv6是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议.

IPv4地址长度为4个8位字节,即32比特,而IPv6的地址长度为128比特,一般写成8个16位字节.

IPv6用十六进制表示(8个16位字节)
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210

IPv6地址区分

地址名称区别
全局单播地址全世界唯一的一个地址
链路本地单播地址同一个数据链路内唯一的地址
唯一本地地址不进行互联网通信时所使用的地址

这篇关于小白学TCP/IP(四)IP协议篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936135

相关文章

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line