- 4位协议版本:
- 4位头部长度:以4字节为单位 20~60
- 8位服务类型: 4位TOS字段
- 16位数据报长度:包括IP头在内,一个IP报文的长度—一个udp报文的最大数据段大小64k-20-8
- 16位标识: udp数据报大小大于MTU大小,但是小于64K-20-8时,会在网络层进行数据分片
- 为了能够在对端有序对分片进行udp数据报重组,因此需要标识哪个分片属于哪个udp数据报
- 3位标记: 1位保留,1位标记是否禁止分片, 1位标记末位分片
- 13位片偏移:标识每个分片数据相对于完整udp数据报起始位置的偏移量–实现分片有序重组
- 8位TTL:默认64,每经过一个路由器跳数则-1,为0时数据丢弃
- 8位上层协议:用于数据分用时选择上层解析协议
- 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
- 32位源地址和32位目标地址: 表示发送端和接收端.
- 选项字段(不定长, 最多40字节):
IP地址:用于唯一标识网络中的一台主机
早期网段划分方式:所有的IP地址分了五类
- A类:高1位固定,高7位是网络号,低24位是主机号0.0.0.0~127.255.255.255
- B类:高2位固定,高14位是网络号,低1 6位是主机号128.0.0.0~191.255.255.255 64k个主机号
- C类:高3位固定,高21位是网络号,低8位是主机号192.0.0.0~223.255.255.255 256个主机号
- D类: 223.0.0.0~239.255.255.255
- E类: 240.0.0.0~247.255.255.255
现在的网段划分式: CIDR方案
在CIDR方案中引入了一个关键信息:子网掩码子网掩码:
本质: uint32 t整数,必须由一串连续的二进制1组成作用:
1.子网掩码与IP地址相与可以得到网络号
2.子网掩码取反,可以得到局域网中主机号个数
例如:
IP: 192.168.122.132 NETMASK: 255.255.255.0
IP & NETMASK: 192.168.122.0
~NETMASK: 255 主机号范围: 0 ~ 255 局域网中由256个主机
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
uint8_ t mac[6]无符号48位的整数,用于标识相邻的设备;出厂的时候就会设定
如何获取相邻设备的MAC地址:
组织一个arp请求数据(包含源端mac+ip+目的端ip)进行广播(目的端mac=0FFFFFFFF)
相邻的设备都能收到这个arp请求,将数据中的目的IP地址与自己网卡的IP地址进行比对,是否相同;
- 若不同,则丢弃数据;
- 若相同则组织arp响应数据,包含自己mac响应给对方
请求方获取到相邻设备的mac地址之后,会缓存起来这个IP地址与mac地址的映射关系,但是并不会缓存太长时间(因为dhcp动态地址分配,主机的IP地址会改变)
MTU:最大传输单元,定义了链路层以太网帧数据最大有多长
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
udp协议因为不会在传输层进行数据分段,当数据大小大于mtu但是小于64k- 20-8的时候,
在网络层就会进行数据分片,将一个完整的udp数据报分片成为一个个的小数据发送出去;这些分片到达对端之后就会进行分片重组,
一个分片出问题,这个udp数据报都会被丢弃,意味着分片越多越危险;
因此用户在应用层进行udp数据分包的时候最好就能考虑每个数据包的大怀要大于mss尽可能减小数据分片的几率
tcp协议在三次握手时就会双方协商mss大小(取决于自身的mtu),取双方较小的一方作为标准进行传输,从发送缓冲区中取出数据进行发送的时候,取出的数据不会大于mss;因此通常会说: tcp在传输层会自动进行数据分段,因此不会在网络层进行数据分片
nat服务通常部署在网关设备上,对流经网关的数据进行地址替换,将数据中的源端地址,替换为本机地址目的是为了让数据怎么出去,响应就怎么回来
之前讨论的 IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的
- 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 发送数据时就会生成表中的映射关系
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
代理服务器又分为正向代理和反向代理: