接上一篇博客 万字详解TCP协议

文章目录

  • IPV4首部
    • (1) 4位版本号(4个比特位)
    • (2) 4位首部长度
    • (3) 8位服务类型(TOS)
    • (4) 16位总长度
    • (5) 8位生存时间(TTL)
    • (6) 8位协议
    • (7) 16位首部校验和
    • (8) 32位源IP地址+32位目的IP地址
  • IP协议
    • 1.地址管理
    • 2.路由算法(路由选择)
    • 3.特殊的IP地址
  • NAT
    • 1. 动态分配IP
    • 2.NAT机制(网络地址替换)
  • IPv6

IPV4首部

(1) 4位版本号(4个比特位)

4位能表示的范围是 0-15 ,指定IP协议的版本,对于IPV4来说就为4

(2) 4位首部长度

首部长度也是4位(0-15),单位为4个字节,4个比特位能表示的最大数字是15,因此IP头部最大长度是4*15,也就是60个字节

(3) 8位服务类型(TOS)

TOS:Type Of Service,由8个比特位构成。

前3个比特位(0到2)为优先度权字段(已经弃用)

3到6分别为最小延迟,最大吞吐量,最高可靠性,最小成本。

这四个bit位中,必须只有一个为1,其他的得是0,不能有多个同时是1,因为不能同时保证最低延迟、最大吞吐量、最高可靠性、最小成本,这4个之间是发送冲突的

最后一位则为保留位,暂时没有定义


但实际开发中,很少涉及到这里。

列如你想要最小延迟时,还是得在应用层(应用程序中),通过一些巧妙地算法、数据结构来提高这里的效率

(4) 16位总长度

和UDP一样IPV4首部也有64K长度的字段

虽然IP协议看起来也是有个最大64K的限制,但是实际上,IP协议内置了分包组包功能

如果一个数据太长了,IP协议就会自动的拆成多个数据报,然后进行传输,然后进行传输,然后接收方就会重新进行组包


16位标识,相当于IP数据报的身份标识,把一个数据拆成多个IP数据报的时候,这三个IP数据报的标识是相同的

13位片偏移,就描述了当前这个包的顺序

3位标志:第一位暂未使用默认必须需是0,第二位表示"禁止分片"为0表示可以分片,为1表示不能分片,第三位表示"更多分片",如果第三位为1表示当前这个分片就是最后一个分片了。如果第三位0表示当前这个分片不是最后一个分片,后面还有分片

如果要在应用层,基于UDP实现拆包组包,就可以照着IP协议的方式抄作业

(5) 8位生存时间(TTL)

这个字段表示一个IP数据报最多在网络上存活多久,这个TTL不是一个"时间"概念,而是一个"次数"。由8个bit构成

TTL是指可以中转多少个路由器的意思,每经过一个路由器,TTL会减少1,直到变成0则丢弃该包。如果默认的TTL是64,经过24个路由器后,那么TTL就剩40了

为啥要有TTL?

主要防止这个IP数据报出现环路转发的情况

主机A => 主机B => 主机C => 主机A

(6) 8位协议

8位协议指的是当前的数据被接收方收到之后,分用的时候,要把载荷(数据)内容交给传输层的哪个协议

分用的时候就需要保证,载荷数据内容得和接下来交给的协议相匹配

这个IP报头中就会通过8位协议来制定传输层使用哪个协议来解析数据,具体就需要去查RFC文档

(7) 16位首部校验和

这个 校验和其实也就是一个类似于crc这样的东西

但是此处只需要校验首部即可,载荷部分(就是一个完整的TCP/UDP数据报)其实已经由TCP或者UDP自己进行校验了

(8) 32位源IP地址+32位目的IP地址

源IP就表示"发件人地址",目的IP就表示"收件人地址",IP协议最重要做的事情就是这个事情

IP协议

IP协议核心功能:

  1. 地址管理:能通过一系列的规则,把网络上的设备的地址给描述出来
  2. 路由选择:根据当下的源地址和目的地址,规划出一条合适的路径

IPV4协议中,主要通过一个32位整数来表示

更常见的做法是把这个32位整数表示成"点分十进制",使用3个点,把一个32位的数字分成4份,每一份就是8bit(一个字节),每一份就是[0-255]

比如 192.168.0.1

192 = 1100 0000

168 = 1010 1000

0 = 0000 0000

1 = 0000 0001

点分十进制存粹是给人看的,而计算机内部仍然是通过32位整数来表示的

1.地址管理

网段划分(组建局域网的时候非常关键)

要求一个局域网里的主机,网络号要相同,主机号不能相同

两个相邻的局域网(通过同一个路由器连接的局域网),网络号必须不相同

把IP地址一分为2,前半部分叫网络号,后半部分叫主机号


如何划分从哪到哪是网络号,可以通过子网掩码来区分

子网掩码非常有特点,左半部分都是1,右半部分都是0

然后把子网掩码和ip地址进行按位与运算,得到的结果就是网络号

子网掩码不一定非得是255.255.255.0,但是这个是最常见的

2.路由算法(路由选择)

此处的路由选择的过程其实就是A到B之间选择一条合适的路径来选择一条路线

这个路径会综合考虑,路径的长短,通信的速度,设备开销的大小

3.特殊的IP地址

  1. 如果是主机号为全0,这个IP就表示网络号,表示当前这个网段

  2. 如果是主机号为1,这个IP通常表示当前网段的“网关”(就是路由器,这个网络的出入口)

  3. 如果是主机号为255,这个IP表示"广播IP"

    如果搞一个UDP数据报,然后把目的IP写成主机号为 255 的IP,此时这个数据就能在当前局域网中广播(会发给每一个局域网中的设备)

  4. 127.*,典型的就是127.0.0.1 环回IP表示自己

NAT

32位的IP地址,其实最多能表示42亿9千万,在当下互联网42亿是不够用的

那么如何解决IP地址不够用的问题呢?

1. 动态分配IP

一个设备接入网络,就分配,没接入网咯就不分配,因为并不是所有设备都在同时联网。但是这种办法并不是很好,因为设备毕竟这么多,并不能保证这些设备一些联网,一些不联网

2.NAT机制(网络地址替换)

使用一个IP地址,来代表一批主机

举个列子

上网买衣服填地址

收件人地址:XX省XX市XX区XX大学

收件人电话:通过电话再来具体区分收件人是谁

这个地址就能表示大学的所有学生的收货地址

一个局域网的中设备的IP是局域网中的IP,局域网的IP就只能在局域网内部来使用

类似于 192.168.xxx.xxx这样的IP,一定是一个局域网内部的IP

局域网内部的IP在同一个局域网内部不能重复,但是两个不同的局域网可以使用重复的局域网IP

此时直接连接到广域网(外网)的路由器设备就会有一个”外网IP“

实际上,这样的局域网里面的设备可能有很多,网络结构可能也很复杂。一个外网IP可能代表着几百,几千甚至几万个网络设备

当局域网内部的数据往广域网上发送的时候,此时路由器就会自动的把其中的源IP替换了**

NAT机制是当下咱们互联网中的典型情况


三类IP都表示局域网

  1. 10.*****
  2. 172.16.-172.31.
  3. 192.168.*

NAT机制虽热解决了IP地址不够用的问题,但是也引入了其它的问题

比如在自己的机器上搭建了一个服务器,此时想让其它用户通过外网来访问你的服务器,这个时候做不到

自己的机器,只有局域网IP(内网IP),内网IP是可以重复的

其它主机没法就根据一个内网IP找到你的服务器(除非是在同一个局域网里)

IPv6

IPV6相当于IPV4的升级版

IPv4是使用4个字节(32位)表示IP地址,IPv6使用16个字节(128位)表示IP地址。

IPv6从根本上解决了IP地址不够用的问题,IPv6和IPv4是不兼容的,所以升级IPv6是一件成本比较高的事情

当下主流还是IPV4,也可能几年后会慢慢普及


下一篇网络知识即将更新

网络编程(六) ———— IP协议(IPV4IPV6)相关推荐

  1. WinSock API网络编程——TCP/IP协议详解

     WinSock API网络编程--TCP/IP协议(http://www.impcas.ac.cn/usr/lujun/browse.asp?id=winsock_tcp)            ...

  2. 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议

    在Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP.UDP协议属于传输层. IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. TCP协议是 ...

  3. 网络编程--TCP/IP协议(一)

    目录 前言 一丶网络基础 <1>认识IP地址 1>具体格式 2>组成 3>分类 4>子网掩码 <2>认识MAC地址 二丶网络设备及相关技术 <1& ...

  4. 网络编程--TCP/IP协议

    参考:https://lijie.blog.csdn.net/article/details/105297532 https://blog.csdn.net/qq_20785973/article/d ...

  5. 网络编程--TCP/IP协议(二)

    目录 前言 一丶TCP协议格式 端口号 序列号 确认号 首部长度 保留字段 标志位字段 窗口大小 检验位 紧急指针 可选项字段 二丶TCP协议的特性 <1>TCP协议的特点 <2&g ...

  6. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  7. 网络编程-TCP/IP协议栈-TCP协议

    TCP协议 TCP协议作用 TCP协议位于协议栈的传输层.当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连 ...

  8. 网络编程-TCP/IP协议栈-IP协议

    协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...

  9. 网络编程——基于TCP协议的通讯录【课程设计】

    网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...

最新文章

  1. 深度学习先驱Bengio:AI顶会论文的Deadline是时候取消了
  2. (linux) Firefox is already running, but is not responding解决方法
  3. 利用 Pandas 将数据集中的某列文本拆分为多行
  4. 做网页需要学哪些计算机知识,网页美工设计需要掌握的电脑常识
  5. p2657 windy数
  6. 【Core Spring】二、装配beans
  7. Android Studio 代码自动提示无效
  8. CentOS修改主机名(hostname)
  9. MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
  10. 为什么现在好多年轻人连1万都掏不出来,却觉得100万很少?
  11. linux 用户管理和帮助命令
  12. 【转】java.util.ResourceBundle使用详解
  13. 232接口针脚定义_VGA接口定义,详细图文资料
  14. visual studio code Python终端运行_微软常用运行库合集 v2020.5.20 装机必备神器静默整合免费版...
  15. 陌陌探探真人头像过网图,探探真实头像蓝V怎么弄?
  16. Delphi中使用ReportMachine 6.5中汇总行不进行汇总的设置问题
  17. word怎么恢复自动保存_如何使用自动恢复自动保存Word文档并恢复丢失的更改
  18. win7计算机管理打开超慢,大师解答win7系统打开资源管理器窗口速度很慢的恢复技巧...
  19. 暖一壶秋色,与你共清欢
  20. 自动生成课堂分析报告写后感想

热门文章

  1. PPT中绘制图形如何导入VISIO编辑
  2. python合并视频和音频_Python做图像处理及视频音频文件分离和合成功能
  3. appium ios自动化环境搭建
  4. 服务器重启oracle数据库服务器,oracle数据库怎么重启_网站服务器运行维护,oracle,数据库,重启...
  5. 组装多媒体计算机步骤及配件,组装计算机实习报告
  6. android spinner自定义样式,android自定义Spinner下拉菜单(下拉列表框)样式
  7. 常见的web服务器软件
  8. web的一些基本名词概念
  9. “鬼影”病毒疑“躲猫猫”避风,金山发专杀工具施救
  10. 图神经网络_task03