admin 管理员组文章数量: 887021
网络协议学习
- 网络协议
- 第01天:基本概念
- 为什么要学习网络协议
- 学习中需要搭建的环境
- 网络协议
- 搭建Java服务器开发环境
- 第02天:集线器-网桥-交换机
- 计算机之间的通信基础
- 计算机之间的连接方式
- 第03天:MAC地址-IP地址-子网掩码
- MAC地址
- IP地址
- 第04天:超网-静态路由
- 超网
- 路由
- 第05天:局域网-NAT
- 基础知识
- NAT
- 第06天:物理层-数据链路层
- 物理层
- 数据链路层(Data Link)
- 以太网
- 第07天:网络层-UDP
- 网络层(Network)
- 传输层
- 第08天:TCP-可靠传输
- TCP
- 可靠传输
- 第09天:TCP-流量控制-拥塞控制
- 流量控制
- 拥塞控制
- 第10天:TCP-序号-确认号-建立连接
- 建立连接
- 第11天:TCP - 释放连接
- 第12天:Socket补充_域名
- 应用层
- 第13天:DNS_DHCP_HTTP
- DHCP
- HTTP
- 第14天:ABNF_请求头_响应头
- ABNF(Augmented BNF)
- 报文格式
- 请求方法
- 第15天:状态码_form提交
- 状态码(Status Code)
- form提交
- 第16天:跨域_Cookie_Session
- 跨域
- Cookie_Session
- 第17天:代理_CDN_网络安全
- 代理
- CDN
- 网络安全
网络协议
第01天:基本概念
思考:数据是如何从一个设备传递到另一个设备的?
这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网
为什么要学习网络协议
- 互联网、移动互联网、物联网,都离不开网络协议
- 最熟悉的网络协议:HTTP
- 为了满足各种需求,有各式各样的网络协议(HTTPS、SMTP、MQTT、RTMP等)
每一种网络协议应用场景不一样
学习中需要搭建的环境
客户端-服务器开发环境
- 客户端:浏览器(HTML+CSS+JS)
- 服务器:Java
.class文件是字节码文件,对于操作系统不是可执行文件
端口接收客户端发送的数据,端口还要有服务器软件,用来处理这些数据,监听客户端发过来的数据。
服务器软件占用某个端口,然后监听端口网络数据的流通,执行Java代码,通过端口,把数据输送回去。
启动服务器软件Tomcat
本地访问http://127.0.0.1:8080
网络抓包
- 浏览器(Chrome、Firefox)、Fiddler、Wireshark
模拟工具
- Xshell(只有Windows版)、Packet Tracer(注册地址)、GNS3
网络协议
有了网络协议,收数据和发数据的两方才能有效地沟通;
规定网络双方两个节点怎么通信,约束客户端和服务器能干什么,客户端能发送什么,服务器能传送什么回去,客户端的发送格式是固定的;
定义国际统一的HTTP协议,这样发送的数据都能接收而不会产生乱码;
客户端发送数据先一层一层加装,然后服务器一层一层解封,应用层的数据就是给服务器软件,比如Tomcat会拿到应用层数据。
服务器返回数据也是一层一层加装,然后客户端一层一层解封;
不管什么网络协议,都是按照上图的标准发送接收数据的;
搭建Java服务器开发环境
使用IDEA,创建新项目和web服务器功能,web文件就给客户端提供的资源,在web文件夹下新建文件
安装服务器软件Tomcat,利用端口,启动部署Tomcat
通过划线的路径,访问到项目里面的资源
http://IP地址:端口号/资源路径
http://127.0.0.0:8080/csw 相当于访问到web文件夹
启动Tomcat,启动成功。
直接访问项目名的话会直接访问里面的index.html、index.htm、index.jsp等文件
访问服务器里面的资源
完成登录注册操作
引用外部的库
第02天:集线器-网桥-交换机
计算机之间的通信基础
通信首先要知道IP地址,计算机上网卡接收数据,网卡接收数据再往上一次层传,还要知道网卡的数据,一般都是自动帮你解析网卡地址,根据IP地址得到网卡地址。
- 需要得知对方的IP地址
- 最终是根据MAC地址(网卡地址),输送数据到网卡,被网卡接收
如果网卡发现数据的目标MAC地址是自己,就会将数据传递给上一层进行处理
如果网卡发现数据的目标MAC地址不是自己,就会将数据丢弃,不会传递给上一层进行处理
计算机之间的连接方式
-
网线直连
需要用交叉线(不是直通线)
使用Packet Tracer模拟计算机连接
ping一下看是否连接上
我们也可以用仿真模式,一步步观察,这个发包等价于ping,ping用的就是ICMP协议
如何知道网卡地址:ARP协议(广播)
广播是在同一个网段中传播的,广播的目的是获取对方的MAC地址
广播就会问某IP地址的MAC地址是什么,该IP就会传回自己的MAC地址
目标MAC地址FFFF.FFFF.FFFF,全F的MAC地址是广播地址,同一个网段的网卡都能接收广播;
ARP是有缓存的; -
同轴电缆
半双工通信:只允许一个方向发送数据;
网卡拿到MAC地址不是自己的,就会把数据都扔掉;
终结电阻:吸收信号,让信号终结,不会让信号叠加冲突;
有的人可以用抓包工具,抓数据,非常不安全; -
集线器(Hub)
模拟器搭建集线器,所有的PC端都会收到,只有特定的才会接收
Hub没有缓存功能,无法实现记忆
设备越多,集线器效率特别低。 -
网桥
能够通过自学习得知每个接口那侧的MAC地址,从而起到隔绝冲突域的作用。
可以判断MAC地址在自己的左侧还是右侧。
模拟器模拟网桥
网桥就只有两个接口,虽然能隔绝一定的计算机,但是效率还是不够高。
- 交换机(Switch)
交换机类似于网桥和集线器的集合。
全双工通信
比集线器更安全
交换机是局域网的最终方案
完全学习完MAC地址后,就可以很快速的运行。
模拟器模拟交换机
交换机学习完MAC地址后,就可以杜绝抓包的现象。
- 路由器
网络直连、同轴电缆、集线器、网桥、交换机
- 连接的设备必须在同一网段
- 连接的设备处在同一广播域
路由器
- 可以在不同网段之间转发数据
- 隔绝广播域
用Packet Tracer模拟路由器
主机发数据之前,首先判断目标IP地址跟我是否在同一个网段
1)在同一个网段:发送ARP,通过交换机\集线器传递数据
2)不在同一个网段:通过路由器转发数据
网关(Gateway):
默认网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP
数据跨网段要先来到网关,路由器就可以实现跨网段
网关要和它所接的那一边的计算机处在同一网段
配置网关IP地址,才能转发数据,否则交换器和路由器连接不上;
PC端也要修改默认网关,否则连接不上路由器,连接上后开始转发数据
我们也一样要通过ARP广播,知道路由器网关的MAC地址,才能传送数据
通过网关跨网段连接,一个网关有IP地址和网卡
第03天:MAC地址-IP地址-子网掩码
MAC地址
每一个网卡都有一个6字节(48bit)的MAC地址(Media Access Control Address)
全球唯一,固化在了网卡的ROM中,由IEEE802标准规定
前3字节:OUI,组织唯一标识符
由IEEE的注册管理机构分配给厂商
后3字节:网络接口标识符
由厂商自行分配
OUI查询
http://standards-oui.ieee/oui/oui.txt
https://mac.bmcx/
MAC地址的表示格式
-
Windows
40-55-82-0A-8C-6D -
Linux、Android、Mac、IOS
40:55:82:0A:8C:6D -
Packet Tracer
4055.820A.8C6D -
当48位全为1时,代表广播地址
FF-FF-FF-FF-FF-FF
MAC地址操作
查看MAC地址
命令:ipconfig /all
修改MAC地址
更改配适器选项 - 属性 - 配置 - 高级 - 网络地址
填写的时候需要把减号(-)去掉
有时候可以通过修改MAC地址蹭网
MAC地址的获取
当不知道对方主机的MAC地址时,可以通过发送ARP广播获取对方的MAC地址
获取成功后,会缓存IP地址、MAC地址的映射信息,俗称:ARP缓存
通过ARP广播获取的是MAC地址,属于动态(dynamic)缓存
存储时间比较短(默认是2分钟),过期了就自动删除
相关命令:
- arp -a [主机地址]:查询ARP缓存
- arp -d [主机地址] :删除ARP缓存
- arp -s 主机地址 MAC地址:增加一条缓存信息(这是静态缓存,存储时间较久,不同系统的存储时间不同)
ARP
-
ARP(Address Resolution Protocol),译为:地址解析协议
通过IP地址获取MAC地址 -
RARP(Reverse Address Resolution Protocol),译为:逆地址解析协议
使用与ARP相同的报头结构
作用与ARP相反,用于将MAC地址转换为IP地址
后来被BOOTP,DHCP所取代
ICMP
ICMP(Internet Control Message Protocol),译为:互联网控制消息协议
IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6
通常用于返回错误消息
- 比如TTL值过期,目的不可达
ICMP的错误消息总是包括了源数据并返回给发送者
IP地址
IP地址(Internet Protocol Address):互联网上的每一个主机都有一个IP地址
最初是IPv4版本,32bit(4字节),2019年11月25日,全球的IP地址已经用完
后面推出的IPv6版本,128bit(16字节)
IP地址组成
IP地址由2部分组成:网络标识(网络ID)、主机标识(主机ID)
同一网段的计算机,网络ID相同
通过子网掩码(subnet mask)可以计算出网络ID:子网掩码 & IP地址
主机所在的网段 = 子网掩码 & IP地址
- IP地址:192.168.1.10
子网掩码:255.255.255.0
按位与
1100 0000 1010 1000 0000 0001 0000 1010
&1111 1111 1111 1111 1111 1111 0000 0000
得到
1100 0000 1010 1000 0000 0001 0000 0000
网段就是192.168.1.0
主机位是0就是网段
主机位全零的,用来表达网段,全部是一的,代表广播IP地址,不能用来做主机ID
计算机和其他计算机通信前,会先判断目标主机和自己是否在同一网段
- 同一网段:不需要由路由器进行转发
- 不同网段:交由路由器进行转发
IP地址的分类
- A类地址:默认子网掩码是255.0.0.0
8bit | 24bit |
---|---|
网络ID 0 开头 | 主机ID |
- B类地址:默认子网掩码是255.255.0.0
16bit | 16bit |
---|---|
网络ID 10 开头 | 主机ID |
- C类地址:默认子网掩码是255.255.255.0
24bit | 8bit |
---|---|
网络ID 110 开头 | 主机ID |
- D类地址:以1110开头,多播地址
- E类地址:以1111开头,保留至今后使用
只有A\B\C类地址才能分配给主机
主机ID为全0,表示主机所在的网段
主机ID为全1,表示主机所在网段的全部主机(广播)
- 可以尝试用ping给某个网段的全部主机发数据
A类地址
-
网络ID
0不能用,127作为保留网段。其中127.0.0.1是本地环回地址(Loopback),代表本机地址
可以分配给主机的
第1部分的取值范围是:1~126 -
主机ID
第2,3,4部分的取值范围是:0~255
每个A类网络能容纳的最大主机数是:256 * 256 *256 - 2 = 2的24次方 - 2 = 16777214
B类地址
-
网络ID
可以分配给主机的
第1部分的取值范围是:128~191
第2部分的取值范围是:0~255 -
主机ID
第3、4部分的取值范围是:2~255
每个B类网络能容纳的最大主机数是:256 * 256 - 2 = 2的16次方 - 2 = 65534
C类地址
-
网络ID
可以分配给主机的
第1部分的取值范围是:192~223
第2、3部分的取值范围是:0~255 -
主机ID
第4部分的取值范围是:0~255
每个C类网络能容纳的最大主机数是:256 - 2 = 254
D类地址
D类地址:没有子网掩码,用于多播(组播)地址
第1部分取值范围是:224~239
E类地址
E类地址:保留为今后使用
第1部分取值范围是:240~255
子网掩码的CIDR表示方法
CIDR(Classless Inter-Domain Routing):无类别域间路由
子网掩码的CIDR表示方法:
- 192.168.1.100/24,代表子网掩码有24个1,也就是255.255.255.0
- 123.210.100.200/16,代表子网掩码有16个1,也就是255.255.0.0
计算工具:https://www.sojson/convert/subnetmask.html
为什么要进行子网划分
-
如果需要让200主机在同一个网段内,可以分配一个C类网段,比如192.168.1.0/24
共254个可用IP地址:192.168.1.1~192.168.1.254
多出54个空闲的IP地址,这种情况并不算浪费资源 -
如果需要让500台主机在同一网段内,那就分配一个B类网段,比如191.100.0.0/16
共65534个可用IP地址:191.100.0.1~191.100.255.254
多出65034个空闲的IP地址,这种情况属于极大的浪费资源
合理进行子网划分
子网划分
子网划分:借用主机位作子网划分,划分出多个子网
可划分为:
- 等长子网划分:将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的
- 变长子网划分:每个子网的可用IP地址数量可以是不一样的
子网划分器:http://www.ab126/web/3552.html
等长子网划分 — 等分成2个子网
本来有一个C类网段,192.168.0.0/24
让子网掩码多一位,此时网络ID就变成了25位,所以后面七位变成了主机位
划分成2个子网段
192.168.0.0/25
192.168.0.128/25
A子网
子网掩码:255.255.255.128/25
主机可用IP地址:192.168.0.1~192.168.0.126
B子网
子网掩码:255.255.255.128/25
主机可用IP地址:192.168.0.129~192.168.0.254
等长子网划分 — 等分成4个子网
等长子网划分 — 等分成8个子网
等长子网划分 — A类子网划分
等长子网划分 — B类子网划分
子网划分的步骤
- 确定子网的子网掩码长度
- 确定子网中的第1个、最后1个主机可用的IP地址
Packet Tracer模拟子网段划分
设置两个子网段
当同一子网段时,能够ping通
当不在同一子网段时,ping不通
补充:10.172.168.1/24
上述是A类地址划分的子网段
等长子网划分 — 等分成 个子网的广播地址
变长子网划分
如果一个子网地址的长度是原网段的(1/2)^n,那么
子网的子网掩码,就是在原网段的子网掩码基础上增加n个1
不等长的子网,它们的子网掩码也不同
假设上图是对192.168.0.0/24进行变长子网划分
- C网段:子网掩码是255.255.255.128/25
- B网段:子网掩码是255.255.255.128/26
- A网段:子网掩码是255.255.255.128/27
- D网段:子网掩码是255.255.255.128/30
- E网段:子网掩码是255.255.255.128/30
思考题:
正常通信需要两台设备在同一网段
如果用公式:子网掩码 & IP地址 = 网段
算出来的网段是一样的,都为192.168.0.0
但是并不能成功传送数据
发送数据的时候,是拿自己的子网掩码和对方的IP地址按位与的,所以这样求出来的网段并不相同;
这样一个网段为:192.168.10.0
另一个网段为:192.168.0.0
所以网段不同,这两台电脑并不能正常通信
第04天:超网-静态路由
超网
超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段
需求:原本有200台计算机使用192.168.0.0/24网段,现在希望增加200台设备到同一个网段
200台在192.168.0.0/24网段,200台在192.168.1.0/24网段
合并192.168.0.0/24、192.168.1.0/24为一个网段:192.168.0.0/23(子网掩码往左移动1位)
思考题
192.168.0.255/23这个IP地址,可以分配给计算机使用吗?
答:这个IP的主机位变成了9位,并没有全为1,所以这个IP地址,可以分配给计算机使用。
合并4个网段
子网掩码向左移动2位,可以合并4个网段
将192.168.0.0/24、192.168.1.0/24、192.168.2.0/24、192.168.3.0/24合并为192.168.0.0/22网段
思考题
下面2个网段,能通过子网掩码向左移动1位进行合并吗?
答:不可以,多出的一位的1并没有合并进去
合并网段的规律
假设n是2的k次幂(k>=1)
子网掩码左移k位能够合并n个网段
假设n是2的k次幂(k>=1)
如果第一个网段的网络号能被n整除,那么由它开始连续的n个网段,能通过左移k位子网掩码进行合并
比如
- 第一个网段的网络号以二进制0结尾,那么由它开始连续的2个网段,能通过左移1位子网掩码进行合并
- 第一个网段的网络号以二进制00结尾,那么由它开始连续的4个网段,能通过左移1位子网掩码进行合并
- 第一个网段的网络号以二进制000结尾,那么由它开始连续的8个网段,能通过左移1位子网掩码进行合并
判断一个网段是子网还是超网
1.首先
看看该网段的类型,是A类网络、B类网络、C类网络
默认情况下,A类子网掩码的位数是8,B类子网掩码的位数是16,C类子网掩码的位数是24
2.然后
如果该网段的子网掩码位数比默认子网掩码多,就是子网
如果该网段的子网掩码位数比默认子网掩码少,就是超网
3.比如
25.100.0.0/16是一个A类子网
200.100.0.0/16是一个C类超网
路由
在不同网段之间,需要有路由器的支持
默认情况下,路由器只知道跟它直连的网段,非直连的网段需要通过静态路由、动态路由告诉它
静态路由
- 管理员手动添加路由信息
- 适用于小规模网络
动态路由
- 路由器通过路由器选择协议(比如RIP、OSPF)自动获取路由信息
- 适用于大规模网络
练习1 — 让4台主机之间可以互相通信
用Packet Tracer开始练习
路由表会说明该怎么传送数据
两台路由器之间要传递数据,路由器必须配置静态路由的下一跳;
两个路由器交换时,也需要配置IP地址,来传递数据
开始配置路由表
跨路由器传送数据成功
查看一下路由表,S代表静态、C代表连接。
路由器配置的是某一个网段,只要是我配置的网段的机器,里面都能找到。
路由表也可以配置精确的IP地址。子网掩码全部表示为255,表示一个特定的IP地址。
如果不知怎么走,设置默认路由
数据包的传输过程
这里仅仅是简述一下数据包的传输过程,后面详细学到网络分层时,会再次详细讲解数据包的传输过程
每个地方的接口都有MAC地址,在数据传送的过程中,源MAC地址和目标MAC地址都会发生改变,源IP地址和目标IP地址一直不变。
第05天:局域网-NAT
基础知识
网络、互联网、因特网
网络:将多台计算机连接起来就组成了网络;
互联网:利用路由器把多个网段连接起来组成的更大的网络;
全世界最大的互联网是:因特网(Internet)
将全世界所有的计算机都连接在一起
一般使用大写I开头的Internet特指因特网,互联网的i是小写的
日常生活中说的:你的电脑上不了网。其实就是指:你的电脑没有连接到因特网
ISP
ISP,Internet Service Provider,Internet服务提供商,比如移动、电信、网通、铁通等
我们平时拉的宽带都是通过ISP连接到Internet的
服务器机房
如果服务器机房利用的是电信的服务,就叫电信机房;
双线机房可以服务电信也可以服务移动,提高访问速度
网络分类
按照网络的范围进行分类,可以分为:局域网、城域网、广域网等
-
局域网(Local Area Network,LAN)
一般是范围在几百米到十几公里内的计算机所构成的计算机网络
常用于公司、家庭、学校、医院、机关、一幢大楼等
局域网中使用最广泛的网络技术叫:以太网(Ethernet)
在电脑、手机上经常见到的一个英文WLAN(Wireless LAN),意思是无线局域网 -
城域网(Metropolitan Area Network,MAN)
一般范围是数十公里到数百公里,可以覆盖一个城市 -
广域网(Wide Area Network,WAN)
一般范围是几百公里到几千公里,可以覆盖一个国家。通常都需要租用ISP的线路。
常见的几种接口
-
FastEthernet
快速以太网接口(100M)
-
GigabitEthernet
千兆以太网接口 -
Serial
串行接口
上网方式
1.电话线入户
这就是平时说的:ADSL电话拨号上网(Asymmetric Digital Subscriber Line)
非对称数字用户线路,提供上、下行不对称的传输带宽
猫(Modem),调制解调器,进行数字信号和模拟信号的转换
-
光纤入户
光猫(Optical Modem),光调节解调器,进行数字信号和光信号的转换 -
网线入户
家用无线路由器的逻辑结构
公网IP、私网IP
IP地址也分为:公网IP、私网IP -
公网IP(Public)
Internet上路由器中只有到达公网的路由表,没有到达私网的路由表
公网IP由因特网信息中心(Internet Network Information Center,Inter NIC)统一分配和管理
ISP需要向Inter NIC申请公网IP -
私网IP(Private)
主要用于局域网。下面是保留的私网网段
A类:10.0.0.0/8,1个A类网络
B类:172.16.0.0/16~172.31.0.0/16,16个B类网络
C类:192.168.0.0/24~192.168.255.0/24,256个C类网洛
NAT
私网IP地址访问Internet需要进行NAT转换为公网IP
NAT(Network Address Translation)
这一步可以由路由器来完成
NAT的特点
可以节约公网IP资源
会隐藏内部真实IP
NAT的分类
-
静态转换
手动配置NAT映射表
一对一转换 -
动态转换
定义外部地址池,动态随机转换
一对一转换 -
PAT(Port Address Translation)
多对一转换,最大程度节约公网IP资源
采用端口多路复用方式,通过端口号标识不同的数据流
目前应用最广泛的NAT实现方式
不同的路由器
不同的路由器连接的也不同,有的可以连接同一网段,有的可以连接不同网段;
第一个包的丢失
因为第一个包还没有ARP解析,也就是没有对应的目的mac地址,在尚无mac地址的情况下,系统内核是不会发包的,路由器在一段链路中是使用mac地址的。无目的mac地址的数据包根本就不会发出去,所以不知道目的mac地址,首先先发ARP解析mac地址,同时第一个包还没有发出去就被自己kill了。后续的包因为有了对应的mac地址就顺利的发出去了。
第06天:物理层-数据链路层
网络互连模型
为了更好地促进互联网络的研究和发展,国际化标准组织ISO在1985年制定了网络互联模型
OSI参考模型,具有7层结构
平时我们用的是TCP/IP协议。学习研究看第三个图
请求过程
客户端一层层加装,服务器再一层层解封装。
网络分层
每一层加装过后,数据就会变换一种名字。每一次可以接收的网络协议也是不同的
物理层
物理层定义了接口标准、线缆标准、传输速率、传输方式等
数字信号、模拟信号
- 模拟信号(Analog Signal)
连续的信号,适合长距离传输
抗干扰能力差,受到干扰时波形变形很难纠正
- 数字信号(Digital Signal)
离散的信号,不适合长距离传输
抗干扰能力强,受到干扰时波形失真可以修复
数据通信模型
- 局域网通信模型
注意:网线不能超过100米 - 广域网通信模型
信道
信道:信息传输的通道,一条传输介质上(比如网线)上可以用有多条信道 - 单工信道
信号只能往一个方向传输,任何时候都不能改变信号的传输方向
比如无线电广播、有线电视广播 - 半双工通信
信号可以双向传输,但必须是交替进行,同一个时间只能往一个方向传输
比如对讲机 - 全双工通信
信号可以同时双向传输
比如手机(打电话,听说同时进行)
数据链路层(Data Link)
链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换点。
数据链路:在一条链路上传输数据时,需要对应的通信协议来控制数据的传输
不同类型的数据链路,所用的通信协议可能是不同的
广播信道:CSMA/CD协议(比如同轴电缆、集线器等组成的网络)
点对点信道:PPP协议(比如2个路由器之间的信道)
数据链路层的3个基本问题
1.封装成帧
2.透明传输
3.差错检验
数据链路层—封装成帧
IP数据包是网络层传输下来的,变成了帧的数据部分
帧开始符和帧结束符代表了开头和结尾
帧(Frame)的数据部分
就是网络层传递下来的数据包(IP数据包,Packet)
最大传输单元MTU(Maximum Transfer Unit)
每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
传送过来的数据包不能超过MTU
以太网的MTU为1500字节
数据链路层—透明传输
因为帧开始符和帧结束符是一个字节,容易和帧里面的数据部分重复
1.使用SOH(Start Of Header)作为帧开始符
2.使用EOT(End Of Transmission)作为帧结束符
数据部分一旦出现了SOH、EOT,就需要进行转义
在数据部分的EOT、SOH前面加上ESC,用来做字节填充
如果已经有了一个ESC,在ESC前面再加一个ESC
链路上的帧会自己去掉转义的字符
数据链路层—差错检验
FCS是用来做差错检验的,在信道上进行传输的时候,如果受到干扰信号,可能会失真。
FCS是根据帧的数据部分+数据链路层首部计算得出的,接收方也会计算一次,看计算结果和FCS是否相等,相等的话就证明数据无误,会把数据传送到上一层,错误的话就会丢失。
以太网
CSMA/CD协议
CSMA/CD(Carrier Sense Multiple Access with Collision Detectio)
载波侦听多路访问/冲突检测
使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧
以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准
使用最多的是:Ethernet V2标准
为了能够检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节。如果数据比较短,还没发送到已经离开发送方,短数据可能碰撞,不知道是冲突了还是怎么样的。大概是正常传输的两倍。
用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧,所以,用交换机组建的网络,依然可以叫做以太网
Ethernet V2帧的格式
以太网V2这个版本是不需要帧开始符和帧结束符的,以太网使用曼彻斯特编码接收端接收帧过程只要发现没有信号跳变,就认为帧结束符。只要有曼彻斯特编码,就不需要帧开始符和帧结束符。
首部:目标MAC地址+源MAC地址+网络类型(IPV4或IPV6)
以太网帧:首部 + 数据 + FCS
数据的长度至少是:64-6-6-2-4=46 = 字节
Ethernet V2标准
当数据部分的长度小于46字节时
数据链路层会在数据的后面加入一些字节填充
接收端会将添加的字节去掉
长度总结
以太网帧的数据长度:46~1500字节
以太网帧的长度:64~1518字节(目标MAC +源MAC + 网络类型 + 数据 + FCS)
PPP协议(Point to Point Protocol )
Address字段:图中的值是0xFF,形同虚设,点到点信道不需要源MAC地址、目标MAC地址
Control字段:图中的值是0x03,目前没有什么作用
Protocol字段:内部用到的协议类型
帧开始符、帧结束符:0x7E
PPP协议—字节填充
1.将0x7E替换成0x7D5E
2.将0x7D替换成0x7D5D
网卡
网卡工作在数据链路层和物理层
网卡接收到一个帧,首先会进行差错校验,如果校验通过则接收,否则丢弃
Wirshark抓到的帧没有FCS,因为它抓到的是差错校验通过的帧(帧尾的FCS会被硬件去掉)
Wireshark抓不到差错校验失败的帧
集线器工作在物理层
第07天:网络层-UDP
网络层(Network)
网络层数据包(IP数据包,Packet)由首部、数据部分组成
数据:很多时候是由传输层传递下来的数据段(Segment)
网络层首部和以太网首部挨在一起
网络层首部-版本、首部长度、区分服务
1.版本(Version)
占4位
0b0100:IPv4
0b0110:IPv6
2.首部长度(Header Length)
占4位,二进制乘以4才是最终长度
0b0101:20(最小值)
0b1111:60(最大值)
3.区分服务(Differentiated Services Field)
占8位
可以用于提高网络的服务质量(QoS,Quality of Service)
全0的话就没有区分服务
客户端发请求给服务器的时候,会经过一些设备,如果网络层首部有某个特定的区分服务的时候,可以让数据优先通过,没有的话就平等对待。
网络层首部-总长度
1.总长度
占16位
首部 + 数据的长度之和,最大值是65535
由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments)
每一片都有自己的网络层首部(IP首部)
网络层首部-标识、标志
1.标识(Identification)
占16位
数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的
有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
一旦数据包过多,超过65535,就会从0开始重新计数
2.标志(Flags)
占3位
第1位(Reserved Bit):保留
第2位(Don’t Fragment):1代表不允许分片,0代表允许分片
第3位(More Fragments):1代表不是最后一片,0代表是最后一片
网络层首部-片偏移
1.片偏移(Fragment Offset)
占16位
片偏移乘以8:字节偏移
每一片的长度一定是8的整数倍
字节偏移
第一片:0
第二片:1400
第三片:2800
由于字节可能太大存不下,将字节偏移除以8,得到片偏移
ping-几个用法
1.ping /?
作用:查看ping的用法
2.ping ip地址 -| 数据包大小
作用:发送指定大小的数据包
图上ping了四次,每次发送的数据包都是不同的
3.ping ip地址 -f
作用:不允许网络层分片
4.ping ip地址 -i TTL
作用:设置TTL的值
5.通过tracert、pathping命令,可以跟踪数据包经过了哪些路由器
网络层首部-协议、首部校验和
1.协议(Protocol)
占8位
表明所封装的数据是使用了什么协议
2.首部校验和(Header Checksum)
用于检查首部是否有错误
网络层首部-生存时间
1.生存时间
占8位
每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告
观察使用ping命令后的TTL,能够推测出对方的操作系统、中间经过了多少个路由器
作用:限制IP数据包在计算机网络中的存在的时间
传输层
传输层有2个协议
1.TCP(Transmission Control Protocol),传输控制协议
2.UDP(User Datagram Protocol),用户数据报协议
UDP-数据格式
UDP是无连接的,减少了建立和释放连接的开销
UDP尽最大能力交付,不保证可靠交付
因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)
UDP长度(Length)
占16位,首部的长度 + 数据的长度
UDP-检验和(Checksum)
检验和的计算内容:伪首部 + 首部 + 数据
伪首部:仅在计算检验和时起作用,并不会传递给网络层
UDP-端口(Port)
1.UDP首部中端口是占用2字节
可以推测出端口号的取值范围是:0~65535
2.客户端的源端口是临时开启的随机端口
3.防火墙可以设置开启、关闭某些端口来提高安全性
4.常用命令行
netstat -an: 查看被占用的端口
netstat -anb: 查看被占用的端口、占用端口的应用程序(需要管理员权限)
telent 主机 端口:查看是否可以访问主机的某个端口
安装telent:控制面板 - 程序 - 启用或关闭Windows功能 - 勾选 “Telnet Client” - 确定
第08天:TCP-可靠传输
TCP
TCP-数据格式
1.数据偏移
占4位,取值范围是0x0101~0x1111
乘以4:首部长度(Header Length)
首部长度是20~60字节
2.保留
占6位,目前全为0
TCP-小细节
1.有些资料中,TCP首部的保留(Reserved)字段占3位,标志(Flags)字段占9位
Wireshark中也是如此
2.UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据)
但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度
分析:
UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐
TCP\UDP的数据长度,完全可以由IP数据宝的首部推测出来
传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度
TCP-检验和(Checksum)
跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
TCP-标志位(Flags)
1.URG(Urgent)
当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
紧急指针里面放的是长度,代表TCP数据部分前面几位是紧急数据
2.ACK(Acknowledgment)
当ACK=1时,确认号字段才有效
3.PSH(Push)
用在交互式网络通信
4.RST(Reset)
当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接
5.SYN(Synchronization)
当SYN=1、ACK=0时,表明这是一个建立连接的请求
若对方同意建立连接,则回复SYN=1、ACK=1
6.FIN(Finish)
当FIN=1时,表明数据已经发送完毕,要求释放连接
TCP-序号、确认号、窗口
1.序号(Sequence Number)
占4字节
首先,在传输过程中的每一个字节都会一个编号
在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号
relative sequence number(相对序号)
下面的Sequence Number(raw)才是原生序号
序号里面存的不是相对序号,因为相对序号数值简单,容易被人攻击,所以把序号搞复杂一点,把数值弄大一些。
相对序号
原生序号
双方都是在建立连接之后,确定各自的序号从哪里开始的,它们的序号是不同的
2.确认号(Acknowledgment Number)
占4字节
在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号
3.窗口(Window)
占2字节
这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节位单位)
可靠传输
TCP-可靠传输-停止等待ARQ协议
ARQ(Automatic Repeat–reQuest),自动重传请求
若有个包重传了N次还是失败,会一直持续重传到成功为止吗?
这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset(RST)断开TCP连接
TCP-可靠传输-连续ARQ协议 + 华东窗口协议
如果接收窗口最多能接收4个包
单发送方只发了2个包
接送方如何确定后面还有没有2个包?
等待一定时间后没有第三个包,就会返回确认收到2个包给发送方
现在假设每一组数据是100个字节,代表一个数据段的数据
每一组给一个编号
TCP-可靠传输-SACK(选择性确认)
在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能
为改善上述情况,发展出了SACK(Selective acknowledgment,选择性确认)技术,告诉发送方哪些数据丢失,哪些数据已经提前收到
使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)
SACK信息会放在TCP首部的选项部分
- kind:占1字节。值为5代表这使SACK选项
- Length:占1字节。表明SACK选项一共占用多少字节
- Left Edge:占4字节,左边界
- Right Edge:占4字节,右边界
一对边界信息需要占用8字节,由于TCP首部的选项部分最多40字节,所以SACK选项最多携带4组边界信息,SACL选项的最大占用字节数 = 4 * 8 + 2 = 34
思考
为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
- 因为可以提高重传的性能
- 需要明确的是:可靠传输是在传输层进行控制的
如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可
第09天:TCP-流量控制-拥塞控制
流量控制
如果接收方的缓存区满了,发送方还在疯狂发送数据
接收方只能把收到的数据包丢掉,大量的丢包会极大浪费网络资源,所以要进行流量控制。
什么是流量控制?
让发送方的发送速率不要太快,让接收方来得及接收处理
原理
通过确认报文中窗口字段来控制发送方的发送速率
发送方的发送窗口大小不能超过接收方给出的窗口大小。当发送方收到接收窗口的大小为0时,发送方就会停止发送数据
rwnd = receive window = 接收窗口
特殊情况
有一种特殊情况
一开始,接收方给发送方发送了0窗口的报文段,后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了,发送方的发送窗口一直为零,双方陷入僵局
解决方案
当发送方收到0窗口通知时,这时发送方停止发送报文,并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小还是为0,则发送方再次刷新启动定时器
拥塞控制
1.拥塞控制
防止过多的数据注入到网络中
避免网络中的路由器或链路过载
2.拥塞控制是一个全局性的过程
涉及到所有的主机、路由器
以及与降低网络传输性能有关的所有因素
是大家共同努力的结果
相比而言,流量控制是点对点通信的控制
链路吞吐量就是可以接收的带宽的大小,在图中是 700M + 600M
拥塞控制是控制整个网络,流量控制是端对端
方法
1.慢开始(slow start,慢启动)
cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK)
cwnd就成倍增长(指数级)
一开始发两个包,然后四个、八个、十六个……,指数级增长
2.拥塞避免(congestion avoidance)
- ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值后,以线性方式增加
- 拥塞避免(加法增大):拥塞窗口缓慢增大,以防止网络过早出现拥塞
- 乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算(cwnd又恢复到初始值)
- 当网络出现频繁拥塞时,ssthresh值就下降的很快
如何知道网络拥塞?
发送发发送过去没有收到对方的确认,说明有些包丢了,网络可能出现拥塞
3.快速重传(fast retransmit)
-
接收方
每收到一个失序的分组后就立即发出重复确认,使发送方及时知道有分组没有到达,而不要等待自己发送数据时才进行确认 -
发送方
只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期后再重传
4.快速恢复(fast recovery)
- 当发送方连续收到三个重复确认,说明网络出现拥塞,就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半,这是为了预防网络发生拥塞
- 由于发送方现在认为网络很可能没有发生拥塞,因此,与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值,而是把cwnd值设置为新的ssthresh值(减小后的值),然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大
快重传 + 快恢复
TCP Reno版本和已废弃版本的优点在哪里,可以直接调整,很快调整,使它不拥塞
发送窗口的最大值
发送窗口的最大值:swnd = min(cwnd,rwnd)
当 rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值
当 cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值
几个缩写
1.MSS(Maximum Segment Size):每个段最大的数据部分大小
在建立连接时确定
服务器的MSS是1460,客户端的MSS是1412,取两个中的最小值
通信过程中传输层的段不能超过1412字节
2.cwnd(congestion window):拥塞窗口
3.rwnd(receive window):接收窗口
4.swnd(send window):发送窗口
swnd = min(cwnd,rwnd),取两者中最小值
5.滑动窗口
就是接收窗口滑动
第10天:TCP-序号-确认号-建立连接
如果我们发送一个HTTP请求给服务器的话,首先要经历三次握手,建立连接
建立连接的时候,传输层首部是32个字节
建立连接的时候双方会确认一些东西,多出一些字节
紫色服务器,蓝色客户端
- 建立连接的请求是没有数据长度的,数据部分占0个字节
第N个包的序号:前面N-1个包的总长度 + 1
希望服务器发送的字节
建立连接
3次握手
状态解读
1.CLOSED:client处于关闭状态
2.LISTEN:server处于监听状态,等待client连接
3.SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态
4.SYN-SENT:表示client已发送SYN报文,等待server的第2次握手
5.ESTABLISHED:表示连接已经建立
前2次握手的特点
1.SYN都设置为1
2.数据部分的长度都为0
3.TCP头部的长度一般是32字节
固定头部:20字节
选项部分:12字节
4.双方会交换确认一些信息
比如MSS、是否支持SACK、Window scale(窗口缩放系数)等
这些数据都放在了TCP头部的选项部分中(12字节)
窗口值等于 = Window * Window size scaling factor
图中就是1025 * 256 = 262400
疑问
1.为什么建立连接的时候,要进行3次握手?2次不行么?
主要目的:防止server端一直等待,浪费资源
2.如果建立连接只需要2次握手,可能会出现的情况
假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server,本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求,于是server就向client发出确认报文段,同意建立连接,如果不采用“3次握手”,那么只要server发出确认,新的连接就建立了,由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的连接已经建立,并一直等待client发来数据,这样,server的很多资源就白白浪费掉了
3.采用“三次握手”的办法可以防止上述现象发生
例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接
4.第3次握手失败了,会怎么处理?
此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包
如果server多次重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接
第11天:TCP - 释放连接
释放连接 - 4次挥手
释放连接 - 状态解读
-
FIN-WAT-1:表示想主动关闭连接
向对方发送了FIN报文,此时进入到FIN-WAIT-1状态 -
CLOSE-WAIT:表示在等待关闭
当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态
在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方 -
FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文
-
CLOSING:一种比较罕见的例外状态
表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文
如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态
表示双方都正在关闭连接 -
LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文
当收到ACK报文后,即可进入CLOSED状态了 -
表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可进入CLOSED状态了
如果FIN-WAIT-1状态下,收到了对方同时带FIN标志和ACK标志的报文时
可以直接进入到TIME-WAIT状态,而无须经过FIN-WAIT-2状态 -
CLOSED:关闭状态
由于有些状态的时间比较短暂,所以很难用netstat命令看到,比如SYN-RCVD、FIN-WAIT-1等
释放连接 - 细节
- TCP/IP协议栈在设计上,允许任何一方先发起断开请求。这里演示的是client主动要求断开
- 一般是等待2倍的MSL(Maximum Segment Lifetime,最大分段生存期)
MSL是TCP报文在Internet上的最长生存时间
每个具体的TCP实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟
可以防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了) - 如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server就会重发FIN
这时可能出现的情况是
① client没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源
② client有个新的应用程序刚好分配了同一个端口号,新的应用程序收到FIN后马上开始执行断开连接的操作,本来
它可能是想跟server建立连接的
释放连接 - 疑问
为什么释放连接的时候,要进行4次挥手?
TCP是全双工模式
- 第1次挥手:当主机1发出FIN报文段时
表示主机1告诉主机2,主机1已经没有数据要发送了,但是,此时主机1还是可以接受来自主机2的数据 - 第2次挥手:当主机2返回ACK报文段时
表示主机2已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的 - 第3次挥手:当主机2也发送了FIN报文段时
表示主机2告诉主机1,主机2已经没有数据要发送了 - 第4次挥手:当主机1返回ACK报文段时
表示主机1已经知道主机2没有数据发送了。随后正式断开整个TCP连接
释放连接 - 抓包 - 有时候在使用抓包工具的时候,有可能只会看到“3次“挥手
这其实是将第2、3次挥手合并了
- 当server接收到client的FIN时,如果server后面也没有数据要发送给client了
这时,server就可以将第2、3次挥手合并,同时告诉client两件事
已经知道client没有数据要发
server已经没有数据要发了
补充知识点:
引言:
长连接断开后一直占用系统资源,可以通过心跳包判断连接是否断开;使用心跳包检测到连接已经死了,就断开连接。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
- 心跳包
由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没有收到服务器的心跳包,则认为连接不可用。
注意:心跳包一般都是很小的包,或者只包含包头的一个空包
第12天:Socket补充_域名
补充:如何区分长连接和短连接?
短连接:
创建好连接,做完一轮交互,就关闭连接
长连接:
建立完连接不会立马断开,而是持续不断的发送数据,经常进行频繁的数据交互
总结;短连接,数据交互后立马断开。长连接,服务器和客户端数据交互十分的频繁,建立的连接不会立马断开,还是持续不断地进行数据交互。
应用层
应用层的常见协议
- 超文本传输:HTTP、HTTPS
- 文本传输:FTP
- 电子邮件:SMTP、POP3、IMAP
- 动态主机配置:DHCP
- 域名系统:DNS
域名(Domain Name)
由于IP地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了域名(比如baidu)
但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的IP地址
域名申请注册:https://wanwang.aliyun/
那干脆全程直接用域名,不用IP地址?
IP地址固定4个字节,域名随随便便都至少10几个字节,这无疑会增加路由器的负担,浪费流量
根据级别不同,域名可以分为
1.顶级域名(Top-level Domain,简称TLD)
2.二级域名
3.三级域名
域名 - 顶级域名的分类
通用顶级域名(General Top-level Domain,简称gTLD)
(公司),(网络机构),(组织机构),.edu(教育)
.gov(政府部门),.int(国际组织)等
国家及地区顶级域名(Country Code Top-level Domain,简称ccTLD)
(中国)、.jp(日本)、.uk(英国)
新通用顶级域名(New Generic Top-level Domain,简称:New gTLD)
.vip、.xyz、.top、.club、.shop等
域名 - 二级域名
二级域名是指顶级域名之下的域名
在通用顶级域名下,它一般指域名注册人的名称,例如google、baidu、microsoft等
在国家及地区顶级域名下,它一般指注册类别的,例如com、edu、gov、net等
每个域名都要DNS去管理
第13天:DNS_DHCP_HTTP
DNS
DNS的全称是:Domain Name System,译为:域名系统
利用DNS协议,可以将域名(比如baidu)解析成对应的IP地址(比如220.181.38.148)
DNS可以基于UDP协议,也可以基于TCP协议,服务器占用53端口
DNS - 服务器
- 客户端首先会访问最近的一台DNS服务器(也就是客户端自己配置的DNS服务器)
- 所有的DNS服务器都记录了DNS根域名服务器的IP地址
- 上级DNS服务器记录了下一级DNS服务器的IP地址
- 全球一共13台IPv4DNS根域名服务器,25台IPv6根域名服务器
用Wireshark抓包
DNS -常用命令
- ipconfig/displaydns:查看DNS缓存记录
- ipconfig/flushdns:清空DNS缓存记录
3.ping域名
4.nslookup 域名
IP地址的分配
IP地址按照分配方式,可以为静态IP地址、动态IP地址
- 静态IP地址
手动设置
适用场景:不怎么挪动的台式机(比如学校机房中的台式机)、服务器等 - 动态IP地址
从DHCP服务器自动获取IP地址
使用场景:移动设备、无线设备等
DHCP
DHCP(Dynamic Host Configuration Protocol),译为:动态主机配置协议
DHCP协议基于UDP协议,客户端是68端口,服务器是67端口
DHCP服务器会从IP地址池中,挑选一个IP地址”出租“给客户端一段时间,时间到期就回收他们
平时家里上网的路由器就可以充当DHCP服务器
DHCP - 分配IP地址的4个阶段
DISCOVER:发现服务器
发广播包(源IP是0.0.0.0,目标IP是255.255.255.255,目标MAC是FF:FF:FF:FF:FF)
OFFER:提供租约
服务器返回可以租用的IP地址,以及租用期限、子网掩码、网关、DNS等信息
注意:这里可能会有多个服务器提供租约
REQUEST:选择IP地址
客户端选择一个OFFER,发送广播包进行回应
ACKNOWLEDGE:确认
被选中的服务器发送ACK数据包给客户端
至此,IP地址分配完成
DHCP - 4个阶段
抓包DHCP的数据包
DHCP - 细节
1.DHCP服务器可以跨网段分配IP地址吗?(DHCP服务器、客户端不在同一个网段)
可以借助DHCP中继代理(DHCP Relay Agent)实现跨网段分配IP地址
2.自动续约
客户端会在租期不足的时候,自动向DHCP服务器发送REQUEST信息申请续约
3.常用命令
ipconfig /all:可以看到DHCP相关的详细信息,比如租约过期时间、DHCP服务器地址等
ipconfig /release:释放租约
ipconfig /renew:重新申请IP地址、申请续约(延长租期)
HTTP
-
HTTP(Hyper Text Transfer Protocol),译为超文本传输协议
是互联网中应用最广泛的应用层协议之一
设计HTTP最初的目的是:提供一种发布和接收HTML页面的方法,由URL来标识具体的资源
后面用HTTP来传递的数据格式不仅仅是HTML,应用非常广泛 -
HTML(Hyper Text Markup Language):超文本标记语言
用以编写网页
补充
搜索一些知识的时候用维基百科搜索
版本
-
1991年,HTTP/0.9
只支持GET请求方法获取文本数据(比如HTML文档),且不支持请求头,响应头等,无法向服务器传递太多信息 -
1996年,HTTP/1.0
支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据)
浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接 -
1997年,HTTP/1.1(最经典,使用最广泛的版本)
支持PUT、DELET等请求方法
采用持久连接(Connection:keep-alive),多个请求可以共用一个TCP连接 -
2015年,HTTP/2.0
-
2018年,HTTP/3.0
标准
- HTTP标准
由万维网协会(W3C)、互联网工程任务组(IETF)协调制定,最终发布了一系列的RFC - RFC(Request For Comments,可以译为:请求意见稿)
HTTP/1.1最早是在1997年的RFC 2068中记录的
✓ 该规范在1999年的RFC 2616中已作废
✓ 2014年又由RFC 7230系列的RFC取代
HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP/1.1成为HTTP的实现标准 - 中国的RFC
1996年3月,清华大学提交的适应不同国家和地区中文编码的汉字统一传输标准被TETF通过为RFC 1922
成为中国大陆第一个被认可为RFC文件的提交协议
RFC的部分内容
抓包看一下,这里所有的蓝色的都是HTTP的报文
用Wireshark查看HTTP流,红色的是我们发送给服务器的,蓝色的是服务器返回给我们的。
红色的是请求报文,蓝色的是响应报文
注:查看完整的数据包还是用Wireshark
报文格式
ASCII中空格的值为20H
GET请求是没有实体主体的,POST请求有实体主体。
CRLF意思是回车换行
第14天:ABNF_请求头_响应头
ABNF(Augmented BNF)
是BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改,增强版
在RFC 5234中表明:ABNF用作internet中通信协议的定义语言
ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是片面的、不严谨的
关于HTTP报文格式的定义
RFC 2616 A.HTTP Message(旧)
RFC 7230 3.Message Format(新)
ABNF - 核心规则
报文格式
报文格式 - 整体
HTTP-message = start-line
*(header-filed CRLF)
CRLF
[message -body]
不管请求报文还是响应报文都是这个格式
/ | 任选一个 |
---|---|
* | 0个或多个。2表示至少2个,36表示3到6个 |
() | 组成一个整体 |
[] | 可选(可有可无) |
报文格式 - request-line、status -line(响应行)
request-line = method SP request-target SP HTTP-version CRLF
start-linen内部有换行,SP就是空格
HTTP-version = HTTP-name “/” DIGIT “.” DIGIT
DIGIT是数字
HTTP-name = %x48.54.54.50 ; HTTP
GET /hello/ HTTP/1.1
status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
HTTP/1.1 200
HTTP/1.1 200 OK
OK是可有可无的
报文格式 - header-filed、message-body
header-filed = field-name “:” OWS filed-value OWS
filed-name = token
filed-value = *(filed-content / obs-fold)
OWS = *(SP /HTAB),OWS可以是空格也可以是table键,也是可有可无的
message-body = *OCTET
GEF请求没有消息体
URL的编码
URL中一旦出现了一些特殊字符(比如中文、空格),需要进行编码
在浏览器地址栏输入URL时,是采用UTF-8进行编码
比如
编码前:https://www.baidu/s?wd=百度
编码后:https://www.baidu/s?wd=%E5%8D%8E%E4%B8%BA
Xshell + telnet
安装一个Xshell(安全终端模拟软件),在Xshell中使用telnet
- 可以直接面向HTTP报文与服务器交互
- 可以更清晰、直观地看到请求报文、响应报文的内容
- 可以检验请求报文格式的正确与否
响应报文的内容
请求方法
RFC 7231, section 4: Request methods:描述了8种请求方法
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIOUS、TRACE
RFC 5789, section 2: Patch method:描述了PATCH方法
- GET:常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)
- POST:常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
- HEAD:请求得到与GET请求相同的响应,但没有响应体
使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。依次可以节约宽带资源 - OPTIONS:用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
OPTIONS * HTTP/1.1 - PUT:用于对已存在的资源进行整体覆盖
- PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
- DELETE:用于删除指定的资源
- TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
- CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
可以用来访问采用了 SSL (HTTPS) 协议的站点
头部字段(Header Field)
头部字段可以分为4种类型
- 请求头字段(Request Header Fields)
有关要获取的资源或客户端本身信息的消息头 - 响应头字段(Response Header Fields)
有关响应的补充信息,比如服务器本身(名称和版本等)的消息头 - 实体头字段(Entity Header Fields)
有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
- 通用头字段(General Header Fields)
同时适用于请求和响应消息,但与消息主体无关的消息头
请求头字段
头字段名 | 说明 | 示例 |
---|---|---|
User-Agent | 浏览器的身份标识字符串 | User-Agent: Mozilla/5.0 (X11; Linux x86-64;rv:12.0) |
Host | 服务器的域名、端口号 | Host: localhost:80 |
Data | 发送该消息的日期和时间 | Data: Tue, 15 Nov 1994 08:12:31 GMT |
Referer | 表示浏览器所访问的前一个页面 | Referer:https://www.baidu |
Content-Type | 请求体的类型 | Content-Type: multipart/form-data |
Content-Length | 请求体的长度(字节为单位) | Content-Length; 348 |
Accept | 能够接受的响应内容类型(Content-Types ) | Accept: text/plain |
Accept-Charset | 能够接受的字符集 | Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 |
Accept-Encoding | 能够接受的编码方式列表 | Accept-Encoding: gzip, deflate |
Accept-Language | 能够接受的响应内容的自然语言列表 | Accept-Language: en-US |
Range | 仅请求某个实体的一部分。字节偏移以0开始 | Range: bytes=500-999 |
Origin | 发起一个针对跨域资源共享的请求 | Origin: http://www.baidu |
Cookie | 之前由服务器通过Set-Cookie发送的Cookie | Cookie: $Version=1; Skin=new; |
Connection | 该浏览器想要优先使用的连接类型 | Connection: keep-alive |
Cache-Control | 用来指定在这次的请求 响应链中的所有缓存机制都必须遵守的指令 | Cache-Control: no-cache |
- q值越大,表示优先级越高,是权重值
- 如果不指定q值,默认是1.0(1.0是最大值)
- Referer,可以用防盗链
- Range,可以用来多线程断点下载,分断下载文件,网络突然断网,会记录每一段的数据下载到哪里
响应头字段
头字段名 | 头字段名 说明 | 示例 |
---|---|---|
Data | 发送该消息的日期和时间 | Data: Tue, 15 Nov 1994 08:12:31 GMT |
Last-Modified | 所请求的对象的最后修改日期 | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT |
Sever | 服务器的名字 | Server: Apache/2.4.1 (Unix) |
Expires | 指定一个时间,超过该时间则认为此响应已经过期 | Expires: Thu, 01 Dec 1994 16:00:00 GMT |
Content-Type | 响应体的类型 | Content-Type: text/html; charset=utf-8 |
Content-Encoding | 内容所使用的编码类型 | Content-Encoding : gzip |
Content-Length | 响应体的长度(字节为单位) | Content-Length: 348 |
Content-Disposition | 一个可以让客户端下载文件并建议文件名的头部 | Content-Disposition: attachment; filename=“fname.ext” |
Accept-Ranges | 服务器支持哪些种类的部分内容范围 | Accept-Ranges: bytes |
Content-Range | 这条部分消息是属于完整消息的哪部分 | Content-Range: bytes 21010-47021/47022 |
Access-Control-Allow-Origin | 指定哪些网站可参与到跨来源资源共享过程中 | Access-Control-Allow-Origin: * |
Location | 用来进行重定向,或者在创建了某个新资源时使用 | Location: http://www.w3 |
Set-Cookie | 返回一个Cookie让客户端去保存 | Set-Cookie:UserID=JohnDoe; Max-Age=3600; Version=1 |
Connection | 针对该连接所预期的选项 | Connection: close |
Cache-Control | 向从服务器直到客户端在内的所有缓存机制告知,它们是否可以缓存这个对象。单位为秒 | Cache-Control: max-age=3600 |
第15天:状态码_form提交
状态码(Status Code)
在RFC 2616 10.Status Code Definitions规范中定义
状态码指示HTTP请求是否已成功完成
状态码可以分为5类:
- 信息响应:100~199
- 成功响应:200~299
- 重定向:300~399
- 客户端错误:400~499
- 服务器错误 :500~599
有些数值是一直都没有用上的。
每个状态码都有英文描述
常见状态码
- 100 Continue
请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完
成,就忽略这个响应
允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断)
在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
请求头中没有token等身份校验的信息,服务器就不往下继续看请求体了
客户端发送的时候并没有发送请求体,只发送了URL、请求头,如果发现请求通过,但没有请求体,就会发一个状态码100,这样就把剩下来的东西发过来
- 200 OK:请求成功
- 302 Found:请求的资源被暂时的移动到了由Location头部指定的URL上
前后端分离的话,具体跳转就是前端控制的,这个时候一般不用重定向
前端根据后台返回数据,使用路由跳转
- 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
304的时候就没有那些html代码。报文是服务器发的,资源缓存在客户端
和缓存有关的请求头,响应头。缓存是由好几个头共同起作用的
- 400 Bad Request:由于语法无效,服务器无法理解该请求
服务器返回400不一定是格式不对,可能是服务器开发人员布置返回
- 401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
- 403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
- 404 Not Found:服务器端无法找到所请求的资源
- 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
- 406 Not Acceptable:服务器端无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应
- 408 Request Timeout:服务器想要将没有在使用的连接关闭
一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下 - 500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
- 501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
服务器必须支持的方法(即不会返回这个状态码的方法)只有 GET 和 HEAD - 502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
- 503 Service Unavailable:服务器尚未处于可以接受请求的状态
通常造成这种情况的原因是由于服务器停机维护或者已超载
403和406的区别,一个是内容一个是类型,403就是有资源,但我不给你,406就是符合请求头要求的资源我没有
form提交
表单格式
form提交- 常用属性
action:请求的URI
URL:
URI:
method:请求方法(GET、POST)
GET:
POST:
POST比GET多了一些数据,就是请求体
enctype:POST请求时,请求体的编码方式
application/x-www-form-urlencoded(默认值)
用&分隔参数,用=分隔键和值,字符用URL编码方式进行编码
multipart/form-data
文件上传时必须使用这种编码方式
请求体变成一段一段了,用boundary分割。用这种文件上传方式,文件不会变的混乱
form提交 - multipart/form-data
结束的时候boundary前后都会有“–”,是不属于boundary的
第16天:跨域_Cookie_Session
跨域
什么是跨域请求
在HTML中,< a >,< form >,< img >,< scrip t>,< iframe >,< link > 等标签以及Ajax都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:
我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
同源策略
浏览器有个同源策略(Same-Origin-Policy)
它规定了:默认情况下,AJAX请求只能发送给同源的URL
同源是指3个相同的:协议、域名(IP)、端口
img、script、link、iframe、video、audio等标签不受同源策略的约束
跨域资源共享
- 解决AJAX跨域请求的常用方法
CORS(Cross-Orign Resource Sharing),跨域资源共享 - CORS的实现需要客户端和服务器同时支持
客户端:
所有的浏览器都支持(IE至少是IE10版本) - 服务器
需要返回相应的响应头(比如Access-Control-Allow-Origin)
告知浏览器这是一个允许跨域访问的请求
Cookie_Session
Cookie
在客户端(浏览器)存储一些数据,存储到本地硬盘(硬盘),服务器可以返回Cookie交给客户端去存储
具体一点:HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。
划红线的是服务器返回给你的ID
Cookie机制
当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:
客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据
Session机制
Session:记录一系列状态
Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session
访问失败客户端是不会保存任何信息的
小明的浏览器就可以成功访问登录,因为小明的浏览器里面有Cookie,有ID,小白新开了一个浏览器,没有Cookie,所以不能成功登录
购物车里面的东西是保存到数据库,而不是靠Cookie来一次次访问的
第17天:代理_CDN_网络安全
代理
代理服务器(Proxy Server)
既是服务器又是客户端
特点:
- 本身不产生内容
- 处于中间位置转发上下游的请求和相应
面向下游的客户端:它是服务器
面向上游的服务器:它是客户端
正向代理、反向代理
正向代理:代理的对象是客户端
反向代理:代理的对象是服务器
正向代理 - 作用
1.隐藏客户端身份
2.绕过防火墙(突破访问控制)
3.Internet访问控制(控制谁能上网,谁不能上网)
路由器设置一台PC端可以上网,其他都不可以上,就可以由这台电脑去,去选择谁可以上网,这台电脑就相当于代理服务器
4.数据过滤
代理可以过滤一些外网的,不健康的信息,不给回响应
5.……
一些免费的正向代理
https://ip.jiangxianli/
https://www.kuaidaili/free/inha/
设置浏览器代理
反向代理 - 作用
1.隐藏服务器身份
2.安全防护
3.负载均衡
先请求到负载均衡服务器,根据负载均衡算法,计算出数据给哪一个服务器处理
代理服务器只负责转发
抓包工具的原理
- Fiddler、Charles等抓包工具的原理:在客户端启动了正向代理服务
- 需要注意的是
Wireshark的原理是:通过底层驱动,拦截网卡上流过的数据
代理服务器 - 相关的头部字段
- Via:追加经过的每一台代理服务器的主机名(或域名)
- X - Forwarded-For:追加请求方的IP地址
- X- Real-IP:客户端的真实IP地址
CDN
CDN(Content Delivery Network或Content Distribution Network),译为:内容分发网络
- 利用最靠近每位用户的服务器
- 更快更可靠地讲音乐、图片、视频等资源文件(一般是静态资源)传递给用户
CDN - 使用CDN前后
- CDN运营商在全国,乃至全球地各个大枢纽城市建立了机房
部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络 - 内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户
CDN - 使用CDN前
输入有一个域名,要知道对应的IP地址,就发送到DNS服务器,DNS服务器会告诉我们IP地址,根据IP地址请求到服务器
CDN - 使用CDN后
首先访问网站DNS服务器,它会叫我们去找CDN DNS服务器,这个时候会返回真实的IP地址,会请求到CDN全局负载均衡系统,这里的CDN会决定你拿到哪一台CDN服务器
用户发起请求,最后获得缓存服务器IP,用户就会请求对应的缓存节点,假如用户先请求CDN边缘节点,发现没有想要的东西,就会向上层CDN节点要东西,如果没有的话就会向源站发起请求,源站就把数据返回。
CDN - 使用举例
使用cdn引入jquery
网络安全
网络通信中面临的4种安全威胁
- 截获:窃听通信内容
- 中断:中断网络通信
- 篡改:篡改通信内容
- 伪造:伪造通信内容
网络层 - ARP欺骗
-
ARP欺骗(ARP spoofing),又称ARP毒化(ARP poisoning)、ARP病毒、ARP攻击
-
ARP欺骗可以造成的效果
可让攻击者获取局域网上的数据包甚至可篡改数据包
可让网络上特定电脑之间无法正常通信(例如网络执法官这样的软件)
让送至特定IP地址的流量被错误送到攻击者所取代的地方
ARP欺骗 - 核心步骤举例
假设主机C是攻击者,主机A、B是被攻击者
1.C只要收到过A、B发送的ARP请求,就会拥有A、B的IP、MAC地址,就可以进行欺骗活动
2.C发送一个ARP响应给B,把响应包里的源IP设为A的IP地址,源MAC设为C的MAC地址
3.B收到ARP响应后,更新它的ARP表,把A的MAC地址(IP_A, MAC_A)改为(IP_A, MAC_C)
4.当B要发送数据包给A时,它根据ARP表来封装数据包的头部,把目标MAC地址设为MAC_C,而非MAC_A
5.当交换机收到B发送给A的数据包时,根据此包的目标MAC地址(MAC_C)而把数据包转发给C
6.C收到数据包后,可以把它存起来后再发送给A,达到窃听效果。C也可以篡改数据后才发送数据包给A
ARP欺骗 - 防护
- 静态ARP
- DHCP Snooping
网络设备可借由DHCP保留网络上各电脑的MAC地址,在伪造的ARP数据包发出时即可侦测到 - 利用一些软件监听ARP的不正常变动
Dos、DDos
-
DoS攻击(拒绝服务攻击,Denial-of-Service attack)
使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问 -
DDoS攻击(分布式拒绝服务攻击,Distributed Denial-of-Service attack)
黑客使用网络上两个或以上被攻陷的电脑作为“僵尸”(肉鸡)向特定的目标发动DoS攻击
2018年3月,GitHub遭到迄今为止规模最大的DDoS攻击 -
DoS攻击可以分为2大类
带宽消耗型:UDP洪水攻击、ICMP洪水攻击
资源消耗型:SYN洪水攻击、LAND攻击
Dos、DDos防御
1.防御方式通常为:入侵检测、流量过滤、和多重验证
堵塞网络带宽的流量将被过滤,而正常的流量可正常通过
2.防火墙
- 防火墙可以设置规则,例如允许或拒绝特定通讯协议,端口或IP地址
- 当攻击从少数不正常的IP地址发出时,可以简单的使用拒绝规则阻止一切从攻击源IP发出的通信
- 复杂攻击难以用简单规则来阻止,例如80端口遭受攻击时不可能拒绝端口所有的通信,因为同时会阻止合法流量
- 防火墙可能处于网络架构中过后的位置,路由器可能在恶意流量达到防火墙前即被攻击影响
3.交换机:大多数交换机有一定的速度限制和访问控制能力
4.路由器:和交换机类似,路由器也有一定的速度限制和访问控制能力
5.黑洞引导
将所有受攻击计算机的通信全部发送至一个“黑洞”(空接口或不存在的计算机地址)或者有足够能力处理洪流的网络设备商,以避免网络受到较大影响
6.流量清洗
当流量被送到DDoS防护清洗中心时,通过采用抗DDoS软件处理,将正常流量和恶意流量区分开
正常的流量则回注回客户网站
传输层 - SYN洪水攻击
1.SYN洪水攻击(SYN flooding attack)
攻击者发送一系列的SYN请求到目标,然后让目标因收不到ACK(第3次握手)而进行等待、消耗资源
2.攻击方法
跳过发送最后的ACK信息
修改源IP地址,让目标送SYN-ACK到伪造的IP地址,因此目标永不可能收到ACK(第3次握手)
3.防护
参考:RFC 4987
传输层 - LAND攻击
1.LAND攻击(局域网拒绝服务攻击,Local Area Network Denial attack)
- 通过持续发送相同源地址和目标地址的欺骗数据包,使目标试图与自己建立连接,消耗系统资源直至崩溃
- 有些系统存在设计上的缺陷,允许设备接受并响应来自网络、却宣称来自于设备自身的数据包,导致循环应答
2.防护
- 大多数防火墙都能拦截类似的攻击包,以保护系统
- 部分操作系统通过发布安全补丁修复了这一漏洞
- 路由器应同时配置上行与下行筛选器,屏蔽所有源地址与目标地址相同的数据包
应用层 - DNS劫持
1.DNS劫持,又称为域名劫持
- 攻击者篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP
- 导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址
- 从而实现非法窃取用户信息或者破坏正常网络服务的目的
2.为防止DNS劫持,可以考虑使用更靠谱的DNS服务器,比如:114.114.114.114
- 谷歌:8.8.8.8、8.8.4.4
- 微软:4.2.2.1、4.2.2.2
- 百度:180.76.76.76
- 阿里:223.5.5.5、223.6.6.6
3.HTTP劫持:对HTTP数据包进行拦截处理,比如插入JS代码
比如你访问某些网站时,在右下角多了个莫名其妙的弹窗广告
HTTP协议的安全问题
1.HTTP协议默认是采取明文传输的,因此会有很大的安全隐患
常见的提高安全性的方法是:对通信内容进行加密后,在进行传输
2.常见的加密方式
- 不可逆
单向散列函数:MD5、SHA等 - 可逆
对称加密:DES、3DES、AES等
非对称加密:RSA等 - 其它
混合密码系统
数字签名
证书
常见英文
- encrypt:加密
- decrypt:解密
- plaintext:明文.
- ciphertext:密文
学前须知
为了便于学习,设计4个虚拟人物呢
1.Alice、Bob:互相通信
2.Eve:窃听者
3.Mallory:主动攻击者
如何防止被窃听
单向散列函数(One-way hash function)
- 单向散列函数,可以根据消息内容计算出散列值
- 散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值
单向散列函数 - 特点
-
根据任意长度的消息,计算出固定长度的散列值
-
计算速度快,能快速计算出散列值
-
消息不同,散列值也不同
-
具备单向性
单向散列函数 - 称呼 -
单向散列函数,也被称为
消息摘要函数(message digest function)
哈希函数(hash function) -
输出的散列值,也被称为
消息摘要(message digest )
指纹(fingerprint)
单向散列函数 - 常见的几种单向散列函数
- MD4、MD5
产生128bit的散列值,MD就是Message Digest的缩写 - SHA-1
产生160bit的散列值 - SHA-2
SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit - SHA-3
全新标准
单向散列函数 - 如何防止数据被篡改
提供一串SHA值,可以把软件包生成散列值,就可以证明是正版的
单向散列函数 - 应用:防止数据被篡改
单向散列函数 - 应用:密码加密
例:如果密码忘记的时候,找回密码,从来没有说把密码重新发给你,而是换一个新密码,因为密码被加密了,是不可逆的。
版权声明:本文标题:网络协议学习(B站观看最多) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1725919939h892832.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论