网络编程3(网络层,数据链路层)
网络层协议
IP协议
1)地址管理
针对网络上的各种设备所在的位置进行描述和区分。
网段划分
IP地址分为两个部分,网络号和主机号
在同一个局域网中网络号必须相同,主机号必须不同;相邻局域网中网络号必须不同,主机号随意。
子网掩码
要如何区分主机号和网络号?在家用级路由器中,例如192.168.23.100中前三个字节是网络号,最后一个字节是主机号,但是在企业级路由器中就可能不是这样,往往是通过子网掩码来进行划分。
子网掩码是由32位的整数来表示的,它的特点二进制表示是左边全是一,右边的全是0,一的长度代表着网络号,0代表主机号,当主机号(0~255)不够用时就会减少一的数量。
三种特殊IP
1)主机号全为0的,表示该网段不能给任何人使用
2)主机号全为1的,表示广播IP,往这个IP上发信息就是向这个局域网中所有设备发消息(只基于UDP使用)。
3)127.*开头的IP,表示的是环回IP。
2)路由选择
网络结构非常复杂,挑选出合适的路径。
网络上的寻路是探索式的,会根据一级一级的路由器进行寻找。
IP协议的报文结构
4位版本:描述的是当前IP协议的版本,要么是IP V6要么是IPV4,也有其他版本 但是其他版本没有大规模推广使用。
4位首部长度:IP协议中报头也是可以变长的,也包含选项,四位首部长度的范围是0~15,单位是4字节,就意味着IP报头最大长度是60字节。
8位服务类型:其中只有四位有效,分别表示最小延迟、最大吞吐量、最高可靠性和最小成本。最小延迟代表着发送时间和收到数据的时间尽量短,最大吞吐量表示单位时间内传输的数据尽量多,最高可靠性代表IP本身不考虑可靠性,在IP层面进量减少,丢包的概率,最小成本表示消耗的系统资源最少。
16位总长度:IP数据包表示报头加载和总的长度,对于单个IP协议来说存在着64 KB的长度上限,但是IP协议自身支持拆包和组包的功能,如果超出64 KB的上限,就会自动拆成多个数据包
16位标志位,3位标志,13位片偏移:拆出来的多个数据包的标志是一样的,接收方就会根据这些相同的标志来完成之后的组包。
13位片偏移描述了每个IP数据包的相对位置(顺序),是因为网络中会有后发先至的情况出现。
3个标志:第一个不使用,第二个表示是否触发了拆包,第三个表示是不是最后一个数据包。
这种拆开又组合的方法也可以使用在UDP中,如果要使用UDP传输一个较大的数据,我们就可以在应用层使用这种思想实现。
8位生存时间:表示当前IP数据包能在网络上存活多久,单位不是时间,而是次数,可能是32,64,128。初始状况下,例如是一个128数据包,每次经过路由器转发一次就会减1,如果生存时间为0了,还没有到达对方,就可以认为该包永远也到不了对方了,就可以丢弃了。
8位协议:描述的是当前的IP数据包载荷部分是使用哪个协议(传输层协议),网络层中8位协议区分载荷交给传输层的哪个协议(是交给TCP还是UDP处理)。
16位首部校验:这里的校验只针对ip协议报头部分,至于载荷部分就由传输层等自己进行校验。
32位源IP和32位目的IP:网络上通过IP地址的方式表达主机所在的位置,又通过点分十进制的方式表示IP地址(通过三个点分成四个部分,例如122.23.231.99,每个部分表示一个字节,每个部分表示范围0~255),这样的方式表示的是给人看的,站在计算机的角度来看是通过32位的整数进行识别和储存的。
NAT机制
上面谈到IP的长度是32位,也就是42亿多,在移动互联网时代,这些IP数量是不够用的,所以在在早期使用了动态IP规划,就是上网的设备分配IP,不上网的设备不分配IP,后来又引用更先进的NAT机制。
在NAT机制中引入了外网(公网)和内外(私网)这样的概念:
内网(私网):带有这些开头的IP就是内网IP
10.*
172.16 *~ 172.31*
192.168*
外网(公网):除去内网就是外网,外网IP是唯一的。
内网IP是允许在不同局域网中IP重复,也就是说在不同的局域网中会出现两个设备IP地址相同的情况,但是在一个局域网中两个设备的IP要不同。
那么就以下几种情况:A,B两个设备
1)A,B是处于同一个局域网
那么可以直接通过IP进行访问
2)A,B处于不同局域网
A,B间禁止访问
3)A是内网要访问外网B(只有这种情况涉及NAT)
此时就体现了NAT机制的核心,当A发送请求时要经过公网路由器(NAT设备),此时这个路由器就会将请求的源IP改为这个路由器的IP,再发送给接收方,接收方再返回响应时就会先返回到路由器,再由路由器先前的记录重新改回A自己的IP。
这样的机制可以使同一个局域网中的所有设备共享一个公网IP。
当B返回响应时要如何准确将多个同时访问的设备改回自己原本的IP?通过维护一个映射端口的表,当同一个局域网中同时有多个设备访问同一个服务器时,公网路由器就会通过一个映射表将源端口和源IP修改成新的端口和公网IP,等到服务器返回时就会根据新的端口找到旧的端口,同时根据旧的端口得到设备的IP。
NAT主要出现在内网和外网交互过程中,必须是内网设备(客户端)访问外网(服务器)。
处理IP地址不够用的方法还有使用IPV6。
数据链路层协议
数据链路层主要是负责相邻结点的通信,最主要的协议就是以太网(IEEE802.3)和wifi(IEEE802.11)。
1)以太网:通过光纤/网线进行通信
以太网数据帧格式
以太网中的地址指的是mac地址/物理地址,和网络层中的IP地址不同,因为数据链路层是负责相邻两个节点,mac地址指的是相邻两个路由器的地址,例如上海——北京——哈尔滨,此时源IP就是上海,目的IP就是哈尔滨,源地址就是上海,目的地址是北京。
数据报的长度只有1500字节,大约1kb,所以IP协议的拆包组包主要是会受到这里的限制(把长度的上限叫做MTU)。
2)wifi:无线信号