网络层首部
- 网络层数据包(
IP数据包,Packet)由首部、数据2部分组成 - 数据:很多时候是由传输层传递下来的数据段
网络包的首部至少有20个字节,因为首部还包含可变部分
版本、首部长度、区分服务
- 版本(占
4个bit)
ob0100:IPv4ob0110:IPv6
- 首部长度(占
4个bite)
- 二进制乘以4才是最终长度
obo101:20(最小值)ob1111:60(最大值),也就代表着可变部分最多40个字节
- 区分服务(占
8个bit)
- 可以用于提高网络的服务质量
- 这个字段上如果有特殊的信息,路由器会先帮你进行转发从而提高通信速度
总长度
- 占
2个字节
- 表示数据包首部+数据的长度之和,最大值是
65535(8个二进制全为1) - 也就是说数据包的最大长度就是65535个字节
- 由于数据链路层对应的数据帧的长度不能超过
1500字节,所以过大的IP数据包,需要分成片传输给数据链路层,而且每一片都有自己的网络层首部(这个拆分工作是由网络层来完成的 )
标识、标志
- 标识(占
16位bit,2个字节)
- 数据包的
ID,当数据包过大进行分片时,同一个数据包的所有片的表示都是一样的 - 有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加
1
- 标志(占
3位bit)
-
第一位bit:保留位
-
第二位(
Dont Fragment):1表示不允许分片,0表示允许分片- 如果第二位为1,则接受方的网络层不会等待其它数据片
-
第三位(
More Fragments):1代表不是最后一片,0代表是最后一片- 第三位为0就代表着该数据片是最后一片,不需要再等待下一个数据片了
片偏移
- 占
13位 - 片偏移乘以
8:字节偏移,当然有时候也可能直接就显示字节偏移 - 每一片的长度一定是8的整数倍
- 接收方就是通过片偏移来将多个数据片排序,最终合在一起的
- 片偏移的长度表示的是数据的长度(不包含头部)
比如上幅图中,第一个数据包片的字节偏移是0,代表该数据片前面没有其它的数据片
- 第一个数据包片的片偏移是
175,字节偏移是1400,代表有1400个字节(数据的长度,不包含首部)在该数据片的前面 - 第三个数据包片的片偏移是
350,字节偏移是2800,因为前面有两个数据长度为1400的片
ping的几个用法
-
ping /?:查看ping的用法 -
ping ip地址 -l数据包大小:发送指定大小的数据包 -
ping ip地址 -f:不允许网络层分片- 如果你指定的网络数据包太大,又不允许它分片,是发不过去的
ping ip地址 -i TTL:设置TTL的值- 通过
tracert、pathping命令,可以跟踪数据包经过了哪些路由器
下图是执行了ping ke.qq.com -l 4000后,每一片头部的相关信息
协议、首部校验和
- 协议
- 占
8个bit,1个字节 - 表明封装的数据(除去首部)使用的是什么协议
- 首部校验和
- 跟数据链路层的
FCS很像,其是用首部的数据计算出一个数据用于检查首部是否出错
源IP地址、目标IP地址
就是我们起始设备的IP地址和目标设备的IP地址
生存时间(TTL—Time To Live)
- 占
8个bit,1个字节 - 每个路由器在转发之前会将
TTL减1,一旦发现TTL减为0,该路由器就会返回错误报告 - 由不同操作系统发出的数据包首部默认的TTL是不一样的,而且一次通信最多也就经过几十个路由器,所以我们可以根据TTL的值推测出对方的操作系统以及通信过程中经过了多少个路由器
生存时间到底有什么用呢?
比如说一个数据包的传输必须要经过两台路由器,但是这两台路由器的配置有错误,路由器1的默认路由是路由器2,路由器2的默认路由是路由器1,这样数据包就会来回在它们两个之间传递,TTL的出现可以在他们传递到一定次数时终止传输
注意:如果因为TTL不够了而通信错误,则这个错误信息是由TTL减为0的那个路由器对应的网关返回的,如下图中,由下图中返回数据包的IP地址为192.168.3.1可知
借助上面这种特性,我们可以固定一个目标IP地址,然后让它的TTL依次增加直到通信成功为止,这样我们就可以知道在整个通信过程中所经过所有路由器网关的IP地址了,当然我们也可以使用tracert、pathping命令去追踪数据包经过了哪些路由器
补充
有些协议不需要从应用层一层一层传递到物理层,部分协议只有两层或者三层,比如工作在数据链路层的协议(CSMA/CD协议和PPP协议),工作在网络层的协议(ARP、IP、ICMP)这三个协议是直接工作在网络层的,所以其不需要网络层和应用层,如下图所示:
传输层
传输层中有两个协议:
TCP(Transmission Control Protocol),传输控制协议UDP(User Datagram Protocol),用户数据报协议
TCP和UDP的区别:
- 连接性
TCP需要通过三次握手建立连接,确认连接后相当于中间有个隐形的管道,而且一旦数据请求结束之后,我们还需要断开这个连接,要不然服务端会一直占用一个端口进行监听UDP不需要建立连接,其是将数据直接传输过去
- 可靠性
TCP是可靠传输,不会丢包,如果在传输过程中包有损坏或者丢失,那么数据包会重新发送UDP是会丢包的,如果在传输过程中包有损失,其不会重新发送
- 首部占用空间
- 每一个协议都会有个首部,因为
TCP要能够保证可靠传输和面向连接,所以其首部肯定是十分复杂的 UDP相当于是直接将数据扔过去,头部不需要有太多的信息,所以首部占用空间肯定比较小
- 传输速率
- 由于
TCP要保证可靠传输,所以其传输速率较UDP协议慢一些
- 资源连接
- 因为
TCP要面向连接,其资源消耗肯定是比较大的
- 应用场景
-
浏览器、文件传输、邮件发送这种我们希望得到的数据是完整的展示给用户的,那肯定用的是
TCP协议 -
一些实时通信的场景肯定是需要用
UDP的,一方面是因为它传输速率比较快一点,另一方面是怕产生不必要的误会- 比如说你现在说了一句话,但由于当前网络比较差导致丢包了,如果使用的是TCP协议,由于其可靠传输的特性,一段时间后又会把这句话发过去,这样就造成了别人听到的和你说的不在同一个时刻,十分混乱
- 应用层协议
- 如果传输层使用的协议是
TCP的话,那么对应的应用层使用的协议只可能是HTTP、HTTPS、FTP、SMTP、DNS - 如果传输层使用的协议是
UDP的话,那么对应的应用层协议只能是DNS
UDP-数据格式
-
UDP是无连接的,减少了建立和释放连接的开销 -
UDP尽最大能力交付,不保证可靠交付- 因此不需要维护一些复杂的参数,首部只有
8个字节(TCP的首部至少20个字节)
- 因此不需要维护一些复杂的参数,首部只有
UDP长度
占16为bit,2个字节,该长度代表的是首部的长度 + 数据的长度也就是总长度
UDP检验和
-
检验和的计算内容:
伪首部 + 首部 + 数据- 伪首部:仅在计算检验和时起作用,并不会传递给网络层;这是协议栈规定的,为了增强我们的检验功能,其固定是1
2个字节(源IP地址、目标IP地址、默认单个字节0,协议编号(UDP对应的是17)、UDP长度)
- 伪首部:仅在计算检验和时起作用,并不会传递给网络层;这是协议栈规定的,为了增强我们的检验功能,其固定是1
端口
UDP首部中端口字段占用2个字节
-
- 可以推测出端口号的取值范围是:
0 ~ 65535
- 可以推测出端口号的取值范围是:
- 客户端的源端口是临时开启的随机端口
- 防火墙可以设置开启/关闭某些端口来提高安全性
服务器会有一些默认端口号,如果是HTTP协议的请求,一般用的是80端口;如果是HTTPS的请求,一般用的是443端口;客户端发过来的MYSQL请求一般是用3306端口进行监听的,比如说通过一些sql语句去数据中查询一些内容。但是一般来说,我们服务器的数据库是不允许客户端直接访问的,因为这非常不安全,万一别人通过一些暴力的手段进入到了数据库中,你存储的数据不就暴露了吗?所以我们一般是客户端发送一个HTTP请求到服务端软件,然后服务器软件再去访问自己服务器上的MYSQL服务。所以为了安全起见,我们会用一个防火墙规定3306端口的TCP请求不允许进入
常用命令行
-
netstat -an:查看被占用的端口 -
netstat -anb:查看被占用的端口、占用端口的应用程序 -
telnet 主机 端口:查看是否可以访问主机的某个端口- 安装
telnet:控制面板——程序——启用或关闭Windows功能——勾选“Talent Client”——确定
- 安装