资讯详情

学习网络协议的历程

完全完成网络协议

image-20211025195939192

一、基础知识和环境建设

互联网上的信息交流不仅仅是我向互联网提交信息,然后你就会收到信息。但通过一系列复杂的过程。

1.数据是如何从一个设备传输到另一个设备的?

所有这些都是由网络协议规定的。可以说,没有网络协议,就没有今天的互联网!

常见的网络协议:HTTP(HTTPS、SMTP、MQTT、RTPM等)根据不同的需要使用不同的协议

2.网络协议面试问题经常在不同领域提出:

学习网络协议的意义:多了解深网络协议层次的原则,更好地配合网络安全进行测试。

3.学习环境的构建:

C/S开发环境
服务器:java
客服端:浏览器

抓包:浏览器,fiddler、wireshark

模拟工具:Xshell、packet tracer、GNS3

数据交互模型的客户服务端和服务器

java语言特性的说明(为什么环境要这样搭建):

C/C 和java的对比

跨平台原理是将不同的平台编译成不同的格式。

例如

  • 要在mac操作时,需要将代码编译成mach-o格式

  • 要在windows上述操作应编译成PE格式

  • 要在linux将上操作编译成ELF格式

针对不同平台就要进行多次编译,使用平台相关的编译器生成对应平台的可执行文件。

java对于操作系统来说,将代码编译成自解码文件并不是直接的可执行文件。

安装在不必要的系统上JVM(java virtual machine),由jvm软件去加载将文件翻译成机器指令。如果代码错误,编译失败,则不会生成字节码文件。

特点:到处编译。

安装JDK就能够使用JVM

搭建jdk环境

安装jdk-8u241-windows-x64

取消公共安装JRE

将安装路径改为所需路径

完成安装

配置环境变量

右键此计算机点击属性,找到高级系统设置

添加jdk的bin目录即可

配置JAVA_HOME

添加bin和jre\bin目录

最后解压tomcat完成相应目录的环境建设

扩展:如何构建两个jdk实现方便的环境切换java在一台电脑上安装两个或jdk如何配置环境变量,实现jdk切换 - 我不吃鸡儿 - 博客园

4.什么是端口号?

端口号:相当于营业厅的窗口

每个端口监控数据,运行不同的软件处理不同的数据。这类软件大致理解为服务器软件

当不同的软件向服务器的同一端口发送数据时,需要部署项目(部署不同的)java项目)

在服务器端构建环境,实现客户服务端和服务器端的通信

访问服务器软件

http://IP地址:端口号/项目

通过ip地址发现服务器,通过端口发现服务器软件,最后通过端口通信访问项目

解压tomcat双击启动指定目录start.bat,访问http://127.0.0.1:8080

5.网络协议、互联网模型

对于不同的网络协议内容,客户服务端和服务端之间的沟通是无法有效的。国际标准组织制定统一的标准http协议使通信更加方便。

国际标准化组织ISO创建的OSI参考模型有七层结构

实践证明TCP/IP四层协议是实用协议

请求过程

在学习和研究过程中,网络模型通常分为五层。下图显示了一般的请求过程。客户端将数据层层包装,然后通过网络线等媒体发送到服务器。服务器收到数据包后,通过层层解包获得原始数据。服务器也是如此。

搭建JAVA服务器

下载idea IntelliJ IDEA 2021.2.3 便携增强版 - 果核剥壳

  • 创建空项目

  • 设置项目位置

  • 添加java模块

  • 创建第一个模块 01_HelloWorld

  • 创建一个java类,命名为 main.java

  • 将代码链接web需要添加服务器的功能web模块。

  • 右键项目,选择添加框架支持,选择web应 使用程序,应用程序

当地建立了服务器和客服端,访问流程如下,客服端通过8080端口要求tomcat发送数据

  • 将tomcat集成到idea添加本地tomcat服务器

  • 添加到项目结构中tomcat依赖

java最好有包(包含层层文件夹),以便在不同的文件夹中取相同的文件名。

  • 创建登录页面来处理登录请求

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>登录</title> </head> <body>  <form action="/hello/login" method="post">     <div>用户名<input name="username"></div>     <div>密码<input name="password"></div>     <button type="submit">登录</button> </orm>

</body>
</html>
  • 创建com.mj.servlet.LoginServlet处理登录请求

package com.mj.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest requst, HttpServletResponse response) throws ServletException, IOException {
        doPost(requst,response);
    }

    @Override
    protected void doPost(HttpServletRequest requst, HttpServletResponse response) throws ServletException, IOException {
        //1.获取客服端请求发送的数据(请求参数)
        String username = requst.getParameter("username");
        String password = requst.getParameter("password");

        System.out.println(username + "_" + password);
        //2.判断
        if("123".equals(username) && "456".equals(password)){
            response.getWriter().write("Login Success");
        }
        else{
            response.getWriter().write("Login Falure");
        }
    }
}

计算机之前的通信基础

基础的通信需要知道对方的ip地址和网卡地址(MAC地址)

  • 源ip地址------目标ip地址

  • 源mac地址-----目标mac地址

确认了目标mac地址是自己才会将数据传递到上一层进行处理

实现两台电脑的连接方式,直接用两根网线进行连接

  • packet tracer演示

    配置两台电脑通过ping和仿真的方式看是否能相互通信

    ping测试

仿真测试

发广播的目的是获取对方的mac地址

arp数据包,目标mac地址为全F代表广播

6.集线器、网桥、交换机

相同设备使用的交叉线,不同设备之间使用紫铜线

  • 同轴电缆---半双工通信、容易冲突、不安全、中间一断全都瘫痪

  • 集线器(相当于同轴电缆升级版)

    半双工、容易冲突、不安全、不智能

    集线器广播时,会将数据包发送给连接到集线器的所有设备(hub没有智商、很傻)

    如果当集线器连接了1000多台设备发送数据包的时候,就会长时间占用带宽,设备越多,效率越低。

  • 网桥

能够得知每个接口那侧的mac的地址,起到隔绝冲突域的作用。就意味着左右两侧可以同时进行通信。

当网桥收录了一侧的mac地址后,当收到数据包的时候发现发送的数据包在同侧,就直接会在网桥处进行切断,不会再往网桥的另外一边进行转发。

  • 交换机

    全双工通信、相当于接口更多的网桥、比集线器安全

交换机能够记录好ip地址,直接将数据包发送到指定的计算机上面去。

如果全球的计算机的都连接到交换机上,ip地址是远远不够的,交换机连接的电脑属于同一个网段。在最开始交换机没有记录mac地址的时候,会发arp广播去询问mac地址,当每个主机都发送arp广播的话,大量的计算机同时广播会极大的占用带宽。广播风暴(就出问题了)

  • 路由器(router)

实现在不同网段中转发数据

隔绝广播域

主机发送数据之前,首先会判断目标主机的ip地址跟它是否在同一个网段

  1. 在同一个网段:通过交换机、集线器等发送arp广播

  2. 不在同一个网段:通过路由器进行网段的判断,从而将数据发送到目标网段的网关接口

配置好路由器两边的网关设置,网关需要和同一边的局域网处于同一网段。

配置完成后打开该端口

配置每台计算机的默认网关,在哪一侧就使用哪一侧端口的网关

实现计算机2和计算机5之间的通信

1.通过网线直连、同轴电缆、集线器、网桥、交换机连接的设备在同一网段、同一广播域

2.网桥和交换机可以起到隔绝冲突域

二、MAC地址、IP地址

1.MAC

每一个网卡都有一个6字节(48bit)的MAC地址(Media Access Control Address)

前3个字节,由IEEE的注册管理机构分配给厂商

后3个字节,由厂商自行分配

不同厂商的oui标识查询: http://standards-oui.ieee.org/oui/oui.txt

不同设备MAC地址的表示方式

Windows 40-55-82-0A-8C-6D

Linux、Android、Mac、 IOS 40:55:82:0A:8C:6D

Packet Tracer 4055.820A.8C6D

  • 当48位mac地址全为1时,代表广播地址 FF-FF-FF-FF-FF-FF

更改mac地址

可以尝试通过更改mac地址来欺骗交换机,达到能进校园网上网的功能

mac地址的获取

设备通过arp广播来获取到目标主机的mac地址

获取成功后会缓存IP地址、MAC地址的映射关系,俗称:ARP缓存

动态获取dynamic,保存期限为两分钟,两分钟后又要重新获取。

查询arp缓存

删除arp缓存

所有保存的ip对应的mac

2.IP地址

windows查询ip地址 ipconfig /all

互联网上每一个主机都有一个IP地址

字节层面上:将ip地址分为4个部分换算成10进制为192.168.1.10

ip地址的组成

网络标识(网络id)、主机标识(主机id)

子网掩码&IP地址得出网段(逐位相与)

IP地址:192.168.1.10

子网掩码:255.255.255.0

前三个部分 代表网络id

最后一个部分 代表主机id

已知ip地址需要结合子网掩码来判断网段、网络id和主机id

主机位表示一个网段,主机位为表示广播,给这个网段所有的主机发送广播

所以实际可用的地址为

ip地址的分类

D类地址和E类地址不会使用到主机上

子网掩码为255.0.0.0

网络id部分不能为全0,127作为保留网段,所以网络位取值为:1~126

127.0.0.1为环回地址(Loopback),代表本机地址。

子网掩码为255.255.0.0

最小网络位为128.0最大网络位为191.255

每一个网络位可容纳主机数为256*256-2,减掉了广播地址和网段地址

子网掩码为255.255.255.0

最小网络位为192.0.0最大网络位为192.255.255

每一个网络位可容纳主机数为256-2,减掉了广播地址和网段地址

子网掩码

CIDR表示方法

192.168.1.100/24,代表子网掩码有24个1,即子网掩码为255.255.255.0

掩码、网段、可用ip广播等在线计算 在线网络计算器 | TCP/IP子网掩码计算换算 —在线工具

3.子网划分

  1. 如果需要两百台主机在同一个网段内,可用分配一个C类网段,比如192.168.1.0/24

这样就有254个可用的ip地址为:192.168.1.1~192.168.1.254

多出了54个空闲的ip,不算浪费资源

  1. 将500台主机放在同一网段中,分配一个B网段,如191.100.0.0/16

共有65536-2个可用地址减去分配的500台剩下65034个ip没有使用造成了极大的资源浪费

等长、变长子网划分

  • 等分成2个子网

划分为2个子网段

A子网:192.168.0.0/25,子网掩码为255.255.255.128 能够容纳126个主机(00000000代表网段,01111111代表广播地址)192.168.0.1~192.168.0.126

B子网:192.168.0.128/25,子网掩码为255.255.255.128 能够容纳126台主机(10000000代表网段,11111111代表广播地址)192.168.0.129~192.168.0.254

  • 划分为4个子网

  • 划分为8个子网

A类子网和B类子网划分类似

将子网地址块划分为原网段的1/2

不等长的子网,他们的子网掩码也不同

假设上图为192.168.0.0/24对上图进行子网划分得出的网段为:

思考各网段的网络号是多少?

子网划分实验

设置两台计算机,分配ip和子网掩码为子网划分后的网段

计算机0 ip为192.168.0.10,子网掩码为255.255.255.128

计算机1 ip为192.168.0.80,子网掩码为255.255.255.128

测试能够正常通信

设置计算机为192.128.0.129/25尝试是否能够通信,发现不能够进行通信,说明两台计算机不在同一个网段,

要使得两个网段能够通信需要在之间加一个路由器,首先进行广播获取mac地址,然后发送icmp报文成功实现通信。

子网划分器:子网划分工具--子网划分器

超网、静态路由

在计算两台计算机确认是否能够通信的时候是用的本机的子网掩码进行计算

超网简介

超网就相当于跟子网反过来,将多个连续的网段合并成一个更大的网段。

比如针对一个C类地址将网络部分的一位划分到主机部分,主机位就变成了9个二进制位,得到的可用主机数量就翻倍。

将192.168.0.0/24和192.168.1.0/24合并为同一个网段为192.168.0.0/23

子网掩码向右边挪移位就是划分子网,规模变小,向左边挪就是扩展为超网,规模就变大。

思考192.168.0.255/23这个ip是否可以分配给计算机使用?

1、计算192.168.0.255/23这个ip地址的网段为192.168.0.0/23

2、去除主机号为全零的网段地址192.168.0.0/23

3、去除主机号为全1的广播地址192.168.1.255/23

所以可以被分配的ip为192.168.0.1/23~192.168.1.254

所以192.168.0.255/23这个ip地址可以被分配给计算机使用

子网合并及注意事项

将子网掩码向左移动两位,可以合并4个网段为1个网段。如以下的网段就合并为192.168.0.0/22

要将两个网段进行合并,需要注意的是合并的网段必须是连续的,对于C端网络来说,当需要合并两个网段为一个网段的时候,只有当ip地址的第三部分的最后一位不相同,其他位相同的时候才能够进行合并。当需要合并4个网段为1个网段的时候需要ip地址第三部分的最后两位不同,其他位相同才能够进行合并。

合并网段的规律

子网掩码向左合并个子网,向左合并个子网,向左合并个子网。

合并2个子网:

开头的网段的最后一位要能够被2整除

第一个网段的网络号以二进制0结尾,那么由它开始连续的2个网段就能够通过左移1位子网掩码进行合并

合并4个子网:

开头的网段的最后一位要能够被4整除

第一个网段的网络号以二进制00结尾,那么由它开始连续的4个网段就能够通过左移2位子网掩码进行合并

以此类推

第一个网段的网络号以二进制000结尾,那么由它开始连续的8个网段就能够通过左移3位子网掩码进行合并

判断一个网段是子网还是超网

根据默认的子网掩码判断网络位是否左移还是右移

例如:192.168.0.1/23就是一个C类超网

首先因为这个网段为C类地址,默认的子网掩码为24位,但是现在只有23位说明子网掩码向左移动了一位,主机位多了一个二进制数,此时为将子网合并为一个大的网络,所以此时是合并为了一个C类超网。

三、路由

练习1--实现4台主机之间相互通信

分析 4个区域的计算机和路由器的对应的网关网关处于同一网段

1.packet tracer路由配置实验

配置路由器和交换机为以下的参数

  • 测试计算机0和计算机1是否能够通信

实现通信

  • 测试计算机2和计算机3是否能够通信

实现通信

  • 测试计算机0和计算机3是否能够通信

测试无法通信,路由器返回信息无法到达目的地址(路由器无法找到这个网段的位置)

默认情况下,路由器只知道跟它直连的网段,非直连的网段需要通过静态路由、动态路由告诉它

2.静态路由配置

配置静态

配置网络和掩码为目标网段,配置下一跳为要传输数据的下一个路由器接口地址

配置serial2/0

配置ip和子网掩码确保两个路由器连接的接口为同一网段

  • 查看路由器0的路由表

可以观察到在设备中的配置本质就是在执行命令行界面的这些命令

  • 配置特定的ip地址

在静态路由的配置中如果需要配置特定的ip地址,需要将掩码改为255.255.255.255

  • 配置一个静态路由使得能够同时访问

配置静态路由网段为192.168.0.0使用计算机4访问计算机0成功实现访问

  • 配置默认路由

不知道访问的地址是怎么走的设置网络和掩码为0.0.0.0,设置默认的下一跳,这样就设置为了默认路由。

优先配置连接路由器少的区域

练习

为了能够实现通过路由器访问的没有通过路由器直连并且没有在同一网段的计算机,配置所有路由和计算机使得所有的电脑能够相互通信。

根据图中所示配置了以下内容

1.各台计算机的ip地址、子网掩码和网关地址

2.路由器与计算机相连接的端口ip(FastEthernet0/0)、路由器之间相互连接的ip地址(Serial2/0)

3.配置的各台路由器中的静态路由

静态路由的配置如下,为了实现配置的方便、更能够方便的查找,直接使用了默认路由设置,使得各个计算机在想与目的计算机通信的时候能够自动的寻找目的ip

路由表参考答案

配置静态路由的时候边缘路由器可以直接配置为默认路由,但是在中间的路由器左右都连接了设备的情况下,在设备少的一边可以配置固定ip,在设备多的一边就配置为默认路由,如下图所示,路由器0和3位边缘路由,路由器1和2为连接了两个设备的中间路由。

3.数据包的传输过程

上图所示,在数据包的传输过程中源ip和目标ip是不会变化的,但是源MAC和目标MAC是会随着数据包的传输而发生改变

4.网络

网络(Network)互联网(internet)因特网(Internet)

ISP(Internet Service Provider)

中国的internet服务提供商,移动,电信,网通,铁通等

家庭的宽带都是通过ISP连接到Internet的

  • 为什么在一些网站中会存在不同isp的下载地址?

因为有不同的运营商提供的机房下载时通过自己网络类型进行选择会一定的提高下载的速度

网络分类

(LAN)

一般是范围几百米到几十公里内的计算机所构成的计算机网络

常用于公司、家庭、学校、医院、机关、一栋大楼

局域网使用广泛的网络技术:

在电脑和手机上的WLAN(Wireless LAN),无线局域网

(MAN)

一般范围是数十公里到数百公里,可以覆盖一个城市

(WAN)

一般范围是几百公里到几千公里,可以覆盖一个国家。通常需要租用ISP的线路

分布较为广泛的分公司可以租用ISP的线路进行网络的构建,实现公司之前的通信。

5.常见的的接口

FastEthernet 快速以太网接口(100M)

GigabitEthernet 千兆以太网接口(1000M)

Serial 串行接口(一般是在路由器上面)

6.上网方式

电话线入户

光纤入户

网线入户

家用无线路由器的逻辑结构

7.公网ip和私网ip

ip地址分为公网的ip和私网的ip

  • 公网ip

Internet上的路由器中只有到达公网的路由器,没有到达私网的路由器表

公网IP由因特网信息中心(NIC)统一分配和管理

ISP需要向Inter NIC申请公网ip

  • 私网ip

主要用于局域网。

保留的私网网段

internet上的设备是无法知道私网地址的

NAT(Network Address Translation)

客户端172.18.250.6和百度服务器202.108.22.5通信,172.18.250.6发送数据时,先转换为219.155.6.240:1723(任意>1024的随机端口),然后再利用这个身份发送数据给百度服务器,然后百度服务器回应数据并发送给219.155.6.240:1723,NAT网关检查自己的关联表,意识到这是自己地私网中172.18.250.6的数据包,然后把这个数据发送给客户端

将私网网段中的设备ip转换为公网的ip地址,使得不同私网中的相同ip虽然有冲突但是也能够相互通信

可以节约公网IP资源,会隐藏内部真实的IP

  • 静态转换

手动配置NAT映射表,一对一转换

  • 动态转换

定义外部地址池,动态随机转换吗,一对一转换

以上两种方式都无法起到节约ip地址的目的,因为私网ip地址还是单独对应了一个公网ip地址

  • PAT(Port Address Translation)

多对一转换,最大程度节约了ip资源

采用端口多路复用方式,通过端口号标识不同的数据流

例如:通过对不同的ip地址进行端口标识,最终汇聚到同一个ip地址

192.168.1.10:23123->200.0.0.10:23123

192.168.1.11:7676->200.0.0.10:7676

192.168.1.12:7676->200.0.0.10:64565

PAT是目前应用最广泛的NAT实现方式

四、网络互联模型

1.不同的路由器

  • 为什么在第一个包的请求中数据会丢失?

当计算机4 ping 计算机5的时候第一个数据包发生了丢失

是因为在最开始需要找到目标ip的时候需要用到发送arp广播知道对方的广播,这之前,在发送第一个数据包的时候数据包到了路由器3,路由器3是发现这个ICMP包不是给自己的,自己也不知道这个包的接收者在哪儿,由于忙碌,就直接将icmp包丢了,然后路由器再转发arp包询问计算机6的mac地址最后知道地址后再进行icmp包的转发。

  • 路由器是否可以连接同一个网段呢?

是可以的,区别在于不同的路由器,部分路由器型号是支持连接同一网段的网络的。

可以看到819HG-4G-IOX路由器的快速以太网口是不用设置IP地址和子网掩码的,相当于实现了交换机的功能,是可以连接同一网段的计算机的。

2.网络互联模型

OSI参考模型,具有7层结构,但是实际运用中更多用到的是4层的TCP/IP协议,但这里我们分为5层对相关知识进行讨论。

3.请求过程

在请求过程中,客户端的数据包首先通过应用层进入其他层,进行层层打包,然后传输到服务器再经过层层的解包才得到原始的数据,每一层添加的数据都是必要且有用的,缺少了任何一层的功能都无法完成数据的传输。

4.网络分层

物理层

物理层定义了接口标准、线缆标准、传输速率、传输方式等

信息传输的通道,一条传输介质上(比如网线)可以有多条信道

信道上可以传输不同的信息

1.单工通信

信号只能够想一个方向传输,任何时候都不能够改变信号的方向

比如无线电广播和有线电视

2.半双工通信

信号可以双向传输,但是只能交替进行,同一时间只能想一个方向传输

比如对讲机

3.全双工通信

信号可以同时双向传输

比如手机

数据链路层

链路:从一个节点到相邻节点的一段物理线路(有线或者无线),中间没有其他交换节点,集线器是咩有智商的,集线器穿插到链路中间时候,两边的线路还是算同一条链路。相当于忽略掉中间的集线器。

封装成帧

以太网理解为CSMA/CD协议,MTU限制为1500个字节

每一个帧都有帧开始符和帧结束符,区别不同的帧的开始和结束。

透明传输

数据部分一旦出现了SOH、EOT,就需要进行转义

在传输的过程中加上ESC数据包,在接收的一旦发现有跟上ESC的时候就直接去掉ESC

差错检验

在信道的传输过程中数据可能会失真,通过差错检验可以大概率保证数据的正确。

FCS=(帧的数据部分+数据链路层首部)的校验

通过计算帧的数据部分和数据链路层首部得到FCS,通过核验FCS查验数据是否有错误

当检验数据时候发生错误,会将错误的数据丢弃。

载波监听多路访问/冲突检测

冲突检测:判断收到的数据是被弹回的数据还是其他设备发送的数据。

一般集线器会使用到这个协议,称使用了CSMA/CD的网络可以称为以太网,传输的为以太网帧

以太网帧格式:Ethernet V2标准 IEEE802.3标准,最多使用

为了检测正在发送的帧是否发生了冲突,以太网的帧至少需要(理论上计算出来了为64字节,两倍的通道长度)

当发送的帧足够长的时候,当帧还在发送的时候发生了碰撞收到了自己发送的帧头的时候(同时检测到了头部和尾部),就能够判定为发生了冲突,一般要求发送的帧为信道的两倍长,理论上就是64字节。

交换机虽然不需要使用CSMA/CD协议了,但是传输的帧依然是以太网帧,所以用交换就组建的网络依然可以叫做以太网。

使用了曼彻斯特编码就不需要使用帧开始符和帧结束符了

以太网帧:首部+数据+FCS

首部:源MAC+目标MAC+网络类型

类型:使用的是ipv4网络还是ipv6网络

数据:数据部分至少需要46字节

👻当数据部分的长度小于46字节时 数据链路层会在数据的后面加入一些字节填充,接收端会将添加的字节去掉

👻长度总结 以太网帧的数据长度: 46~ 1500字节 以太网帧的长度: 64~1518字节(目标MAC +源MAC+网络类型+数据+ FCS)

  • PPP协议(Point to Point Protocol)

PPP协议的字节填充

点到点链路是不需要源mac和目标mac一定是从一端到另外一端的,所以A部分为FF

在传输到路由器的时候帧是不一样的,首部和尾部发生了变化,但是网络层的东西是一样的

当两个路由器之间接了交换机的时候发送的帧就不是PPP协议帧了而是以太网帧,就包含了源mac地址和目标mac地址

思考PPP协议帧为什么不需要源mac地址和目标mac地址?

点对点协议就是从路由器的一头传到另一个路由器,当两个路由器相连的时候也不需要发送广播,直接就可以进行数据的传输,所以不需要源mac地址和目标mac地址。

  • 网卡

使用wireshark抓取数据包进行分析,接收到的数据包只有14个字节,为什么没有FCS?

网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收(会直接丢掉帧尾的FSC),校验失败就直接丢弃数据包的所有内容。

集线器,交换机,路由器分别属于那些网络分层?

集线器属于物理层,交换机属于数据链路层,路由器属于网络层。

网络层

网络层数据包由两个部分构成(IP数据包,Packet)由首部和数据两部分组成

数据包解析

首部

■版本(Version) 占4位 0b0100: IPv4 0b0110: IPv6 ■首部长度(Header Length) 占4位,二进制乘以4才是最终长度 0b0101: 20 (最小值) 0b1111: 60 (最大值)

首部长度一般都为20bit

■区分服务(Differentiated Services Field) 占8位 可以用于提高网络的服务质量(QoS, Quality of Service),让优先级高的先通信

区分服务字段一般为全零,没有设置

■总长度

占16位,首部+数据长度之和,最大值为65535

■由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments) 传输给数据链路层 每一片都有自己的网络层首部 (IP首部)

帧分割后是怎么重新合并到一起的还原为一个完整的ip数据包?

每一片数据都会有IP首部,可以通过IP首部重新合并到一起

■标识(Identification) 占16位 数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的 有一个计数器专门管理数据包的ID,每发出一个数据包, ID就加1

当ping百度的时候wireshark中可以查看被分割的数据包,发送一个用于ping的ICMP数据包被分割为了三个部分,前两个包为ip数据包,查验到最后一个包的时候识别出了为ICMP数据包。

■标志(Flags) 占3位 第1位(Reserved Bit) :保留 第2位(Don't Fragment) : 1代表不允许分片,0代表允许分片 第3位(More Fragments) : 1代表不是最后一片, 0代表是最后一片

cmd中ping ke.qq.com

设置数据包大小为4000并且不允许分片,可以发现包发送不出去

■片偏移(Fragment Offset)

占13位,片偏移乘以8才表示字节偏移

使用指定数据包进行ping的时候有ICMP的8个字节的头部加上数据包头部的固定20字节再加上发送的800个字节总共就是828个字节

ICMP头部的8个字节

  • ping 的几个用法

ping /?     			   //查看ping的用法
ping ip地址 -l 数据包大小    //发送指定大小的数据包
ping ip地址 -f			 //不允许网络层分片

■协议

表明网络层包装的协议是什么

部分的数据没有走所有的网络分层,有些数据会通过传输层传输到网络层,但是有些数据只是属于网络层就没有用到传输层的协议。部分协议只工作在网络层 ,比如ARP IP ICMP。

通过数据包可见ICMP属于网络层的协议,逐层往下传输数据。

arp协议是链接数据链路层和网络层的协议,ICMP是链接运输层和网络层的协议

各种协议的10进制标志

■首部检验和

将首部进行计算,检验出一个值确保数据的正常

■生存时间(Time To Live, TTL)

占8位,每个路由器在转发之前都会将TTL减1,一旦发现TTL减为0,路由器就会返回错误报告

观察使用Ping命令后的TTL可以推测出对方的操作系统,中间经历了多少个路由器

通过tracert 、pathping命令,可以跟踪数据包经过了哪些路由器

意义:

路由器有路由表,当两个路由器都是对方的默认路由,此时如果没有生存时间,这个数据包就会无限的在两个路由器之间进行转发,无限占用带宽,造成了死循环。

不同的操作系统会有不同的TTL值

ping ip地址 -i TTL 		 //设置TTL的值
//通过tracert、pathping命令 ,可以跟踪数据包经过了哪些路由器

传输层

TCP(Transmission Control Protocol),传输控制协议

UDP(User Datagram Protocol),用户数据报协议

TCP发送会有失败重传的机制,所以用于浏览器、文件传输等,实时通信的话一般使用UDP协议,确保在直播或者通话的时候没有过重传。

应用层使用HTTP、HTTPS、FTP、SMTP、DNS协议的数据通常会传入网络层接着使用TCP协议传输数据。

UDP

UDP是无连接的,减少了建立和释放连接的开销 UDP尽最大能力交付,不保证可靠交付 因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)

UDP长度(Length) 占16位,首部的长度+数据的长度

  • 检验和

伪首部+首部+数据

伪首部尽在计算检验的时候起作用,不会传递给网络层,使检验更加严谨,更加安全,检错能力更强

  • 端口号

常见的协议使用的默认端口号

UDP首部中端口是占用2字节 可以推测出端口号的取值范围是: 0~ 65535

客户端的源端口是临时开启的随机端口 服务器的端口一般为固定端口,设置给其他的客服端提供服务

防火墙可以设置开启\关闭某些端口来提高安全性 服务的访问不是说你开启了3306端口就能直接访问mysql数据库,一般是通过HTTP协议间接性的通过内部访问数据库中的数据。通过防火墙关闭外界对一些端口的访问可以阻止一些非法的请求。

常用命令行

netstat -an		//查看被占用的端口
netstat -anb	//查看被占用的端口、占用端口的应用程序
telnet主机端口	 //查看是否可以访问主机的某个端口
安装telnet: 控制面板-程序-启用或关闭Windows功能-勾选"Telnet Client” -确定

通过telnet命令连接端口,可以连接正在使用这个端口的服务,比如连接到使用3306端口的mysql就会要求输入mysql的账号密码进行登录

5.TCP

UDP数据包对比示例

TCP数据格式

  • 数据偏移

判断首部长度 占4位,取值范围是0x0101~0x1111 乘以4:首部长度(Header Length) 首部长度是20~60字节

  • 保留

占6位,目前全为0

  • 检验和

跟UDP一样,TCP检验和的计算内容:伪首部+首部+数据 伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层

  • 标志位

URG(Urgent) 当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送

ACK (Acknowledgment) 当ACK=1时,确认号字段才有效

PSH(Push)

RST (Reset) 当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接

SYN (Synchronization) 当SYN=1、ACK=0时,表明这是一个建立连接的请求 若对方同意建立连接,则回复SYN=1、ACK= 1

FIN(Finish) 当FIN= 1时,表明数据已经发送完毕,要求释放连接

  • 序号(Sequence Number)

占4字节 首先,在传输过程的每一一个字节都会有一个编号 在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号

  • 确认号(Acknowledgment Number)

占4字节 在建立连接后,确认号代表:期望对方下一-次传过来的TCP数据部分的第一个字节的编号

  • 窗口(Window)

占2字节 这个字段有流量控制功能,用以告知对方下一 次允许发送的数据大小(字节为单位)

1.有些资料中,TCP首部的保留(Reserved) 字段占3位,标志(Flags) 字段占9位,Wireshark中也是如此

都可以认为是正确的,因为在保留的9位中前三位是没有使用的,所以算入了保留位也是可以的。

2.UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据) 但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度。

UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对挤 TCP\UDP的数据长度,完全可以由IP数据包的首部推测出来 传输层的数据长度=网络层的总长度-网络层的首部长度-传输层的首部长度

可靠传输

将完整的数据切成几块发出去后,发现有丢失的包,能够将这个包进行重新发送。

  • 停止等待ARQ协议

发现效率很低,提出改进方案

  • 连续ARQ协议+滑动窗口协议

窗口大小由接收放确认

对滑动窗口协议的详细分析

在发送过程中如果遇到了数据丢失,这时候如果使用了SACK选择性确认,就只是重新发送丢掉的那个数据包,不会发送已经发送的数据包。

发送数据的时候窗口是可变的,给回数据的时候会给发送方确认窗口大小。

  • SACK(选择性确认)

在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、 2、3、4、5中的3丢失了) TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5) 这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能

为改善.上述情况,发展出了SACK (Selective Acknowledgment),选择性确认技术 告诉发送方哪些数据丢失,哪些数据已经提前收到 使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)

在长度可变的选项中放入SACK,表示哪些字节没有收到哪些字节收到了。

Kind:占1字节。当值为5的时候,代表这是SACK选项 Length:占1字节。表明SACK选项一共占用多少字节 Left Edge:占4字节,左边界. Right Edge:占4字节,右边界

一对边界信息需要占用8字节,由于TCP首部的选项部分最多40字节,所以 40减去Kind和Length占用,40-2=38字节可以用来作为边界信息,所以SACK选项最多携带4组边界信息 SACK选项的最大占用字节数= 4*8 + 2= 34

具体数据包展示

可以观察到一个问题,他的序号为1,但是原生序号为2790487164

减去得到的编号可以当做数据包唯一标识,意味数据包为同一请求的数据,真正储存的序号是一个很大的值,显示中的1开始的值是通过计算得到的逻辑上的开始值 也是这种方式进行换算。

思考:

为什么选择在传输层将数据进行分割,而不是等到网络层再分片传递给数据链路层?

因为可以提高重传的性能 需要明确的是:可靠传输是在传输层进行控制的 如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传 如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可

若有个包重传了N次还是失败,会一直持续重传到成功为止么?

这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST) 断开TCP连接

UDP的数据格式就更简单了,在他的传输机制中就没有重传机制无法保证可靠传输,

流量控制

发数据给流量的过程中,告诉了我接受窗口的大小,告诉窗口大小告诉服务器缓慢有序的发送数据过来。

接收窗口大小和缓存有关

如果接收方的缓存区满了,发送方还在疯狂的发送数据那么会产生什么影响?

接收方只能把收到的数据包丢掉,大量的丟包会极大着浪费网络资源 所以要进行流量控制

什么是流量控制?

让发送方的发送速率不要太快,让接收方来得及接收处理

原理 通过确认报文中窗口字段来控制发送方的发送速率 发送方的发送窗口大小不能超过接收方给出窗口大小 当发送方收到接收窗口的大小为0时,发送方就会停止发送数据

开始,接收方给发送方发送了0窗口的报文段 后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了 发送方的发送窗口一直为零,双方陷入僵局

解决方案 当发送方收到0窗口通知时,这时发送方停止发送报文 并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小 如果接收的窗口大小还是为0,则发送方再次刷新启动定时器

拥塞控制

防止过多的数据注入到网络中 避免网络中的路由器或链路过载

理论上当R1路由器发送300M/s的数据R2发送500M/s的数据时,800M的数据可以绰绰有余的通过1000M的带宽,但是当R1路由器发送700M/s的数据R2发送600M/s的数据时,1300M的数据通过1000M的带宽时就会造成过载,就会丢弃过载的数据包。

随着输入的量越来越大,理想情况就是一直停留在1000M/s,实际上的吞吐量少于理想情况,再当输入的负载更多的增加时候,就会产生拥塞,到最后甚至会出现死的状态。

拥塞控制是一个全局性的过程 涉及到所有的主机、路由器 以及与降低网络传输性能有关的所有因素 是大家共同努力的结果

相对比而言,流量控制是点对点通信的控制

拥塞控制的方法

几个缩写

MSS(Maximum Segment Size):每个段最大的数据部分大小,只会在建立连接时确定

传输层头部和数据包 20|1460 段,segment
网络层头部和数据包 20|1480 包,packet
数据链路层数据包 1500 帧,frame

传输层头部为32个字节的时候是什么情况?

可以看到选项中存在MSS,和SACK,有些包中MSS是不一样的

当客服端和服务器中两个MSS数据支持的最大值不一样的时候取最小的那一个,这个过程叫做协商

cwnd(congestion window):拥塞窗口

rwnd (receive window) :接收窗口

swnd (send window) :发送窗口

当网络通畅,拥塞窗口说现在发5000都没得问题,但是接收窗口能接收到数据为3000字节,所以只能发3000字节的数据。

当网络拥塞,接收窗口能接受3000的数据,但是拥塞窗口说现在有点堵请发送800字节的数据,最后就会发送800字节的数据

swnd = min(cwnd, rwnd) 发送窗口的发送的数据量取拥塞窗口和接收窗口中最小的一个

发送窗口的最大值: swnd = min(cwnd, rwnd) 当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值 当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值

慢开始

(slow start,慢启动)

相当于试探性的发送,最开始发送一个数据段,发现接收比较快,然后发送两个,接收也比较快,然后发送4个,发现网路依然通畅,最后依次增加发送的量。

总结:cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK),cwnd就成倍增长(指数级)

拥塞避免

(congestion avoidance)

ssthresh (slow start threshold) :慢开始阈值,cwnd达到阈值后,以线性方式增加 拥塞避免(加法增大) :拥塞窗口缓慢增大,以防止网络过早出现拥塞 乘法减小:只要网络出现拥塞,把ssthresh减半,于此同时,执行慢开始算法(cwnd又恢复到初始值) 当网络出现频繁拥塞时,ssthresh值就下降的很快

快速重传、恢复

(fast recovery、retransmit)

接收方 每收到一个失序的分组后就立即发出重复确认,使发送方及时知道有分组没有到达,而不要等待自己发送数据时才进行确认。

发送方

只要连续收到三个重复确认相当于确认丢包了(总共4个相同的确认),就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期后再重传

当发送方连续收到三个重复确认,就执行“乘法减小”算法,把ssthresh减半,是为了预防网络拥塞

与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值,而是把cwnd值设置为ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大" ),使拥塞窗C缓慢地线性增大

抓包中的重传和快重传

6.连接管理

建立连接

wireshark抓包演示

三次握手建立连接

A发送SYN=1,ACK=0给B请求建立连接,B回复SYN=1,ACK=1给A表示同意建立连接,然后A发送给B,SYN=0,ACK=1表示成功建立连接

然后就可以发送http请求给服务器,服务器则对应返回很多的数据包

序号、确认号的详细解释

相对序号和原生序号:TCP报文中的1代表的是相对的序号,因为简单的序号会带来风险,容易被抓包导致所有数据的泄露,所以实际上的序号不能设置为1开始,那么怎么设置序号呢?

序号是在建立连接的时候确定的是随机的,在数据段中的序号和ACK号都是通过相应的计算得到的序号,实际的ACK序号和其他数据段的序号可以通过实际的序号进行计算得到。

图像分析:客户端和服务器建立通信的时候都会给对方确认一个随机的真实序号,实际发送的序号为初始序号+1,然后通过计算数据段的长度,确认返回的ACK值为初始序号+1+数据段的长度。

在建立连接的1,2,3步里面的序号和ACK详情,都是只有头部没有数据部分。

建立连接之后要开始发送http请求了

在3和4步ACK相当于对上一个请求的回应,在http请求中依然是A对B请求数据,并且没有接收到B的响应,所以发送的序号和ACK和上一个数据段一样

然后第四步发送了一个K字节的http请求,服务器应答,开始回复数据,每一个包的序号就是原生的序号加上之前所有包的字节大小再加1,每一个包的ack就是需要对方响应包的开始的字节序号

最后客服端给服务器一个应答,他发送的数据包序号为s1+k+1,希望服务器返回s2+b1+b2+b3+b4+1开始的数据包。

在确认包中TCP数据部分依然为0

客户端发送的序号初始值用在了客户端的序号和服务端的ACK号,服务器端的序号初始值用在了服务器的序号和客户端的ACK号。

三次握手

CLOSED: client处于关闭状态

LISTEN: server处于监听状态, 等待client连接

SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态

SYN-SENT:表示client已发送SYN报文,等待server的第2次握手

ESTABLISHED:表示连接已经建立

  • 前两次握手的特点

在进行tcp连接的时候头部为32字节,其中12个字节包含的是选项中的数据

其中使用的有MSS、是否支持SACK、Window scale(窗口缩放系数)确认真正的窗口大小

为什么建立连接的时候,要进行3次握手? 2次不行么? 主要目的:防止server端一直等待, 浪费资源

如果建立连接只需要2次握手,可能会出现的情况

  • 假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server

  • 本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求

  • 于是server就向client发出确认报文段,同意建立连接

  • 如果不采用"3次握手”,那么只要server发出确认,新的连接就建立了

  • 由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认, 也不会向server发送数据

  • 但server却以为新的连接已经建立,并一直等待client发来数据,这样server的很多资源就白白浪费掉了

采用“三次握手”的办法可以防止.上述现象发生 例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求

标签: 55v2a3b变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台