小白学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

相关文章

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源