计算机网络<七>——网络层以及UDP协议

1,017 阅读9分钟

网络层首部

  • 网络层数据包(IP数据包,Packet)由首部、数据2部分组成
  • 数据:很多时候是由传输层传递下来的数据段

网络包的首部至少有20个字节,因为首部还包含可变部分

版本、首部长度、区分服务

  1. 版本(占4bit
  • ob0100IPv4
  • ob0110IPv6
  1. 首部长度(占4bite
  • 二进制乘以4才是最终长度
  • obo10120(最小值)
  • ob111160(最大值),也就代表着可变部分最多40字节
  1. 区分服务(占8bit
  • 可以用于提高网络的服务质量
  • 这个字段上如果有特殊的信息,路由器会先帮你进行转发从而提高通信速度

总长度

  • 2个字节
  • 表示数据包首部+数据的长度之和,最大值是655358个二进制全为1
  • 也就是说数据包的最大长度就是65535个字节

  • 由于数据链路层对应的数据帧的长度不能超过1500字节,所以过大的IP数据包,需要分成片传输给数据链路层,而且每一片都有自己的网络层首部(这个拆分工作是由网络层来完成的 )

标识、标志

  1. 标识(占16bit2个字节)
  • 数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的表示都是一样的
  • 有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
  1. 标志(占3bit
  • 第一位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的值
  • 通过tracertpathping命令,可以跟踪数据包经过了哪些路由器

下图是执行了ping ke.qq.com -l 4000后,每一片头部的相关信息

协议、首部校验和

  1. 协议
  • 8bit1个字节
  • 表明封装的数据(除去首部)使用的是什么协议

  1. 首部校验和
  • 跟数据链路层的FCS很像,其是用首部的数据计算出一个数据用于检查首部是否出错

源IP地址、目标IP地址

就是我们起始设备的IP地址和目标设备的IP地址

生存时间(TTL—Time To Live)

  • 8bit1个字节
  • 每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,该路由器就会返回错误报告
  • 由不同操作系统发出的数据包首部默认的TTL是不一样的,而且一次通信最多也就经过几十个路由器,所以我们可以根据TTL的值推测出对方的操作系统以及通信过程中经过了多少个路由器

生存时间到底有什么用呢?

比如说一个数据包的传输必须要经过两台路由器,但是这两台路由器的配置有错误,路由器1的默认路由是路由器2,路由器2的默认路由是路由器1,这样数据包就会来回在它们两个之间传递,TTL的出现可以在他们传递到一定次数时终止传输

注意:如果因为TTL不够了而通信错误,则这个错误信息是由TTL减为0的那个路由器对应的网关返回的,如下图中,由下图中返回数据包的IP地址为192.168.3.1可知

借助上面这种特性,我们可以固定一个目标IP地址,然后让它的TTL依次增加直到通信成功为止,这样我们就可以知道在整个通信过程中所经过所有路由器网关的IP地址了,当然我们也可以使用tracertpathping命令去追踪数据包经过了哪些路由器

补充

有些协议不需要从应用层一层一层传递到物理层,部分协议只有两层或者三层,比如工作在数据链路层的协议(CSMA/CD协议和PPP协议),工作在网络层的协议(ARPIP、ICMP)这三个协议是直接工作在网络层的,所以其不需要网络层和应用层,如下图所示:

传输层

传输层中有两个协议:

  • TCPTransmission Control Protocol),传输控制协议
  • UDPUser Datagram Protocol),用户数据报协议

TCP和UDP的区别:

  1. 连接性
  • TCP需要通过三次握手建立连接,确认连接后相当于中间有个隐形的管道,而且一旦数据请求结束之后,我们还需要断开这个连接,要不然服务端会一直占用一个端口进行监听
  • UDP不需要建立连接,其是将数据直接传输过去
  1. 可靠性
  • TCP是可靠传输,不会丢包,如果在传输过程中包有损坏或者丢失,那么数据包会重新发送
  • UDP是会丢包的,如果在传输过程中包有损失,其不会重新发送
  1. 首部占用空间
  • 每一个协议都会有个首部,因为TCP要能够保证可靠传输和面向连接,所以其首部肯定是十分复杂的
  • UDP相当于是直接将数据扔过去,头部不需要有太多的信息,所以首部占用空间肯定比较小
  1. 传输速率
  • 由于TCP要保证可靠传输,所以其传输速率较UDP协议慢一些
  1. 资源连接
  • 因为TCP要面向连接,其资源消耗肯定是比较大的
  1. 应用场景
  • 浏览器、文件传输、邮件发送这种我们希望得到的数据是完整的展示给用户的,那肯定用的是TCP协议

  • 一些实时通信的场景肯定是需要用UDP的,一方面是因为它传输速率比较快一点,另一方面是怕产生不必要的误会

    • 比如说你现在说了一句话,但由于当前网络比较差导致丢包了,如果使用的是TCP协议,由于其可靠传输的特性,一段时间后又会把这句话发过去,这样就造成了别人听到的和你说的不在同一个时刻,十分混乱
  1. 应用层协议
  • 如果传输层使用的协议是TCP的话,那么对应的应用层使用的协议只可能是HTTPHTTPSFTPSMTPDNS
  • 如果传输层使用的协议是UDP的话,那么对应的应用层协议只能是DNS

UDP-数据格式

  • UDP是无连接的,减少了建立和释放连接的开销

  • UDP尽最大能力交付,不保证可靠交付

    • 因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)

UDP长度

16bit2个字节,该长度代表的是首部的长度 + 数据的长度也就是总长度

UDP检验和

  • 检验和的计算内容:伪首部 + 首部 + 数据

    • 伪首部:仅在计算检验和时起作用,并不会传递给网络层;这是协议栈规定的,为了增强我们的检验功能,其固定是12个字节(源IP地址目标IP地址默认单个字节0协议编号UDP对应的是17)、UDP长度

端口

  • UDP首部中端口字段占用2个字节
    • 可以推测出端口号的取值范围是:0 ~ 65535
  • 客户端的源端口是临时开启的随机端口
  • 防火墙可以设置开启/关闭某些端口来提高安全性

服务器会有一些默认端口号,如果是HTTP协议的请求,一般用的是80端口;如果是HTTPS的请求,一般用的是443端口;客户端发过来的MYSQL请求一般是用3306端口进行监听的,比如说通过一些sql语句去数据中查询一些内容。但是一般来说,我们服务器的数据库是不允许客户端直接访问的,因为这非常不安全,万一别人通过一些暴力的手段进入到了数据库中,你存储的数据不就暴露了吗?所以我们一般是客户端发送一个HTTP请求到服务端软件,然后服务器软件再去访问自己服务器上的MYSQL服务。所以为了安全起见,我们会用一个防火墙规定3306端口的TCP请求不允许进入

常用命令行

  • netstat -an:查看被占用的端口

  • netstat -anb:查看被占用的端口、占用端口的应用程序

  • telnet 主机 端口:查看是否可以访问主机的某个端口

    • 安装telnet:控制面板——程序——启用或关闭Windows功能——勾选“Talent Client”——确定