ios模型规定的网络模型一共有7层,但是实际使用过程中,4层的TCP/IP模型是经常使用的,网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的,前面已经讲了:(1)物理层,(2)数据链路层。本次笔记将记录网络层、运输层的UDP,运输层的TCP将放在下次笔记中记录。
网络层主要是:IP、ICMP、ARP协议等。
(1)如下图所示,网络层的报文主要有两部分组成:首部、数据。
(2)首部:网络层添加的报文。
(3)数据:上一层“运输层”传过来的数据报文。
1、网络层数据包报文中,首部得固定长度是20个字节,首部得可变长度部分尾40个字节,总长度为20~60个字节。
2、网络层数据包报文得总长度为65535个字节,是指:首部长度+数据长度。
3、数据链路层中报文要求网络层传过来的数据长度不能超过1500个字节。如果网络层传过来的数据超过了1500个字节,将对网络层中的报文进行分片,每片都是含有网络层的报文首部的。
网络层报文的格式如下所示,下面将针对报文中的每个部分的内容进行解释。下图所示的占的多少位,并不是字节,一个字节有8位。
0100:IPV4
0110:IPV6
占4位,二进制乘以4才是最终长度
最小值:0101,对应的十进制值是5,所以最终首部长度最小是5*4=20字节
最大值:1111,对应的十进制值是15,所以最终首部长度最大时15*4=60字节。
由于首部固定长度是20字节,所以可变长度是0~40字节。
占16位
3.1.首部+数据部分的长度之和,即整个数据包的长度,最大值是65535字节。
3.2.整个数据包是要传给数据链路层作为帧的数据部分的,但是帧的数据部分不能超过1500字节,所以过大的IP数据包,会被分成片(fragments)传输给数据链路层。
而且每一片fragments都有自己的网络层首部(IP首部)。
4.1.占8位,可以用来提高网络的服务质量,Quality of Service
4.2.没有值时:0x00;如果值是0x40,可能路由器就会优先传输这个给IP包,即提高网络服务质量。
区分服务这部分是不需要用户关心的。
5.1.占16位,数据包的ID,当数据包传给数据链路层时,发现数据包过大,数据包就会进行分片。每一片fragments都有自己的IP首部,而且这些片的IP首部的标识部分都一样。这样就能区分哪些片是一个IP包拆分的。被分片的数据包的标识位ID是不变的,所有片的标识都是一样的。
5.2.数据包的ID:代表是哪个IP包。而且有一个计数器专门管理数据包的ID,没发出一个数据包,ID就加1。
5.3.这个时候虽然能确定下来片fragments属于哪个数据包,但是怎么确定哪个片属于数据包的哪个部分呢?使用下面介绍的片偏移的方式。
如果数据包过大,标识的数值加到最大的时候,就会变成0,从0从新开始加。
同一个数据包的标识ID是一样的,那么划分的长度都是最长的,所以可以通过片偏移的方式,从一个片的位置找到下一个片的位置。
1.占13位,片偏移乘以8:字节偏移,每一片的长度一定是8的整数倍。
2.字节偏移:
第一片:从IP数据包首部后的第0字节处开始算,共1400字节
第二片:从IP数据包首部后的第1400字节处开始算,共1400字节。
第三片:从IP数据包首部后的第2800字节处开始算,共1000字节。
所以第一片的字节偏移是0,其IP首部中片偏移就是0/8=0
第二片的字节偏移是1400,其IP首部中片偏移就是1400/8=175
第三片的字节偏移是2800,其IP首部中片偏移就是2800/8=350
3.为什么不直接用字节偏移呢,而是要再除以8,用片偏移呢?
因为存放偏移量的这部分一共才13位,最大值是8192-1=8191。而整个IP数据包的最大长度是65535字节。所以如果用字节偏移量的话,很可能13位不够表示。
1.占3位,每一位有不同的含义。
2.第一位(Reserved Bit):保留位
3.第二位(Don't Fragment):1代表不允许分片,0代表允许分片
4.第三位(More Fragments):1代表不是最后一片,0代表最后一片。
一旦发现第三位是0,说明这个网络层的数据包已经组装好了。
只对网络协议报文中的首部进行检验。刚开始首部检验和的几位全是零,对首部计算之后的检验值放在首部检验和的位置。
网络层的数据是从运输层传下来的,那么运输层用的什么协议
会被记录下来,放在网络层首部的协议位置处。
另外,ICMP也有协议字段,但是这些协议是被划分到网络层的。
传输层的TCP协议的数据,或者UDP协议的数据,都会传输给网络层,被打包成IP协议的数据。
占8位
1.每个路由器在转发之前都会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告。
2.各个操作系统的发送数据的默认TTL,减一的次数也是不一样的。
如果没有上面的生存时间,如果用户配置错误,导致数据在两个路由器之间来回的传输出数据,就会占据路由器,导致路由器无法工作。
所以百度服务器应该是部署在linux服务器上,所以中间经历了64-52=12个服务器。
3.ping baidu.com -i 1
设置ping的数据的TTL是1,那么经过第一个路由器时就会减成0,就不会往下再发送包,而是返回报错信息。
我得ip:192.168.43.143。所以我的第一个网关地址就是192.168.43.1:
1.传输层的TCP协议的数据,或者UDP协议的数据,都会传输给网络层,被打包成IP(IPV4、IPV6)协议的数据。
2.传输层主要有两个协议:
1.TCP(Transimission Control Proticol),传输控制协议
如果之前的数据没有发送成功,还会再发送一次,那么就打乱了实时性(现在接收的信息,突然插入一个之前的信息)。
2.UDP(User Datagram Protocol),用户数据报协议。
如果之前的数据没有成功发过来,那我也不要了,我只关注当前的信息:音视频通话。
3.两个协议的大致区别:
4.我们一般发送一个请求,是先在应用层用一个协议封装一个数据,然后在发给下一层,即传输层。
TCP协议一般封装的是,来自应用层的HTTP/HTTPS等协议封装的数据
UDP协议一般封装的是,来自应用层的DNS协议封装的数据。
1.UDP是无连接的,减少了建立和释放连接的开销
2.UDP尽最大可能交付传输的数据,但是不保证数据的完整性,即不保证可靠交付。
3.因此不需要维护一些复杂的参数,首部只有8个字节。(TCP首部至少20个字节)
1.UDP长度
16位,2字节:表示 首部的长度+数据的长度
2.UDP校验和 Checksum
检验和的计算部分:伪首部+首部+数据
伪首部:仅在计算检验和时起作用,并不会传递给网络层。
3.端口Port
1.服务器可以在一个端口上开启一个服务器软件,这个服务器软件来监听发送到这个端口的数据。之后服务器软件再从8080端口将数据返回给客户端。
2.UDP首部中每个端口部分占用2字节,可以推测出端口号的取值范围0~65535。
3.客户端的源端口是应用软件发送请求时的端口,而且是临时开启的随机端口,不固定。
临时开一个端口发数据,所以同一个应用软件前后两次发数据时,源端口很可能是不一样的。
4.服务响应请求,返回数据时。此时UDP数据包首部中的目的端口部分,就是客户端发送这个数据的源端口。
客户端接收到响应的数据,发现目的端口是12656,就会恍然;原来是响应我上次从12656端口发送的数据。
服务器发送数据时,源端口不变。
5.防火墙可以设置开启/关闭一些端口来提高安全性。
6、防火墙和服务器之间的管理
用户只能发请求过来,请求获得服务器数据,不能通过账号或密码直接访问服务器。
注意:服务器是采用80端口监听数据的。
下面是抓包分析UDP报文数据格式。
1.传输层的首部是1f 40 0f a8 00 3f 0e 73这8个字节,下面的部分02开始是传输层的数据部分。
2.传输层的数据会传给网络层,被封装成包:而且数据部分是从1f 40 0f a8 00 3f 0e 73这8个字节开始。