旭泽建站,去掉网址中的wordpress,微推客,软装设计师在介绍IP协议之前#xff0c;先抛出一个概念#xff1a;IP地址的作用——定位主机#xff0c;具有将数据从主机A跨网络传输到主机B的能力#xff0c;有了TCP提供的策略#xff0c;例如滑动窗口、拥塞控制等#xff0c;IP去执行它#xff0c;所以我们通常叫TCP/IP协议先抛出一个概念IP地址的作用——定位主机具有将数据从主机A跨网络传输到主机B的能力有了TCP提供的策略例如滑动窗口、拥塞控制等IP去执行它所以我们通常叫TCP/IP协议有了这两个就可以实现可靠的传输
路由器: 即配有IP地址, 又能进行路由控制
在路由器层面上确实是根据IP报文进行路由的但是在网络上跑的MAC帧
跨网络传输的本质是无数个局域网子网转发的结果所以想理解网络传输就是理解局域网通信个人建议先看这篇文章https://www.cnblogs.com/my_life/articles/6100830.html然后在看这篇文章就会更容易理解网络传输的本质
IP协议格式 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节. 8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要. 16位总长度(total length): IP数据报整体占多少个字节. 16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的. 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示更多分片, 如果分片了的话,最后一个分片置为1, 其他是0. 类似于一个结束标记. 13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了). 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL- 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环 8位协议: 表示上层协议的类型 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏. 32位源地址和32位目标地址: 表示发送端和接收端 选项字段(不定长, 最多40字节): 略 1.如何将报头和有效载荷分离 利用首部长度 报头长度在[20,60]之间16位总长度-首部长度有效载荷 2.如何分用 利用8位协议 3.怎么知道报文被分片了 如果是更多分片是1或者如果更多分片是0片偏移分片0 4.如何保证是同一个报文的分片都能被识别出来 16位标识 5.哪一个是第一个哪一个是最后一个怎么确认其他的分片 1.第一个更多分片1片偏移0 2.最后一个更多分片0片偏移0 3.当前的起始位置自身长度下一个分片的位置 6.如何正确的组装起来 片偏移升序即可 7.怎么保证合起来的报文是正确的 TCP/IP校验和 8.如果有一个分片丢失是重传一个分片还是一个报文分片好不好 1.重传一个报文 2.分片不好比如一个报文的不丢失概率是百分之90分片以后每一个分片的丢失概率也是百分之90这样丢失的概率会变得更大 子网划分
IP地址分为两个部分, 网络号和主机号 网络号: 保证相互连接的两个网段具有不同的标识; 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号; 不同的子网其实就是把网络号相同的主机放到一起,如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
下面讲的都是CIDR划分方案按照IP地址的五类去划分局限性很大 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号; 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾; 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号; 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关; ⭐ 数据是如何发送到服务器的? 路由器是连接两个或多个网络的硬件设备在路由器上有两种网络接口分别是LAN口和WAN口
LAN口Local Area Network表示连接本地网络的端口主要与家庭网络中的交换机、集线器或PC相连。
这里的LAN口应该就是所谓的网关地址我猜的
WAN口Wide Area Network表示连接广域网的端口一般指互联网。 我们将LAN口的IP地址叫做LAN口IP也叫做子网IP将WAN口的IP地址叫做WAN口IPO也叫做外网IP。
我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下 不同的路由器子网IP其实都是一样的通常都是192.168.1.1子网内的主机IP地址不能重复但是子网之间的IP地址就可以重复了。每一个家用路由器其实又作为运营商路由器的子网中的一个节点这样的运营商路由器可能会有很多级最外层的运营商路由器的WAN口IP就是一个公网IP了。如果希望我们自己实现的服务器程序能够在公网上被访问到就需要把程序部署在一台具有外网IP的服务器上这样的服务器可以在阿里云/腾讯云上进行购买。
NAT
由于私网IP不能出现在公网当中因此子网内的主机在和外网进行通信时路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP这样逐级替换最终数据包中的源IP地址成为一个公网IP这种技术成为NATNetwork Address Translation网络地址转换。 NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;在NAT路由器内部, 有一张自动生成的, 用于地址转换的表; 当 10.0.0.10 第一次向 163.221.120.9发送数据时就会生成表中的映射关系;
NATP
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机? 这时候NAPT来解决这个问题了. 使用IPport来建立这个关联关系
实际上通信的并不只是A、B、C这几个主机通信的是A、B、C上特定的进程进程都是有自己的端口号可能一个主机有多个进程要访问外网NAT路由器还要区分同一台主机上不同的进程 这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
代理服务器
关于这部分内容这篇文章我个人觉得写得很不错https://blog.csdn.net/qq_45217499/article/details/120892537
路由
在复杂的网络结构中, 找出一条通往终点的路线;
数据在路由的过程中实际就是一跳一跳Hop by Hop“问路”的过程。所谓“一跳”就是数据链路层中的一个区间具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
IP数据包的传输过程中会遇到很多路由器这些路由器会帮助数据包进行路由转发每当数据包遇到一个路由器后对应路由器都会查看该数据的目的IP地址并告知该数据下一跳应该往哪跳。
路由器的查找结果可能有以下三种 路由器经过路由表查询后得知该数据下一跳应该跳到哪一个子网。 路由器经过路由表查询后没有发现匹配的子网此时路由器会将该数据转发给默认路由。 路由器经过路由表查询后得知该数据的目标网络就是当前所在的网络此时路由器就会将该数据转给当前网络中对应的主机。 我们可以使用route命令查看云服务器的路由表 Destination代表的是目的网络地址。 Gateway代表的是下一跳地址。 Genmask代表的是子网掩码。 Flags中U标志表示此条目有效可以禁用某些条目G标志表示此条目的下一跳地址是某个路由器的地址没有G标志的条目表示目的网络地址是与本机接口直接相连的网络不必经路由器转发。 Iface代表的是发送接口。 当IP数据包到达路由器时路由器就会用该数据的目的IP地址依次与路由表中的子网掩码Genmask进行“按位与”操作然后将结果与子网掩码对应的目的网络地址Destination进行比对如果匹配则说明该数据包下一跳就应该跳去这个子网此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后没有找到匹配的目的网络地址此时路由器就会将这个数据包发送到默认路由也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG实际就是将该数据转给了另一台路由器让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后最终就能到达目标主机所在的目标网络此时就不再根据该数据包目的IP地址当中的网络号进行路由了而是根据目的IP地址当中的主机号进行路由最终根据该数据包对应的主机号就能将数据发送给目标主机了