思考:数据是如何从一个设备传递到另一个设备的?
这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网
启动服务器软件Tomcat
本地访问http://127.0.0.1:8080
网络抓包
模拟工具
有了网络协议,收数据和发数据的两方才能有效地沟通;
规定网络双方两个节点怎么通信,约束客户端和服务器能干什么,客户端能发送什么,服务器能传送什么回去,客户端的发送格式是固定的;
定义国际统一的HTTP协议,这样发送的数据都能接收而不会产生乱码;
客户端发送数据先一层一层加装,然后服务器一层一层解封,应用层的数据就是给服务器软件,比如Tomcat会拿到应用层数据。
服务器返回数据也是一层一层加装,然后客户端一层一层解封;
不管什么网络协议,都是按照上图的标准发送接收数据的;
使用IDEA,创建新项目和web服务器功能,web文件就给客户端提供的资源,在web文件夹下新建文件
安装服务器软件Tomcat,利用端口,启动部署Tomcat
通过划线的路径,访问到项目里面的资源
http://IP地址:端口号/资源路径
http://127.0.0.0:8080/csw 相当于访问到web文件夹
直接访问项目名的话会直接访问里面的index.html、index.htm、index.jsp等文件
访问服务器里面的资源
完成登录注册操作
通信首先要知道IP地址,计算机上网卡接收数据,网卡接收数据再往上一次层传,还要知道网卡的数据,一般都是自动帮你解析网卡地址,根据IP地址得到网卡地址。
网线直连
需要用交叉线(不是直通线)
使用Packet Tracer模拟计算机连接
ping一下看是否连接上
我们也可以用仿真模式,一步步观察,这个发包等价于ping,ping用的就是ICMP协议
如何知道网卡地址:ARP协议(广播)
广播是在同一个网段中传播的,广播的目的是获取对方的MAC地址
广播就会问某IP地址的MAC地址是什么,该IP就会传回自己的MAC地址
目标MAC地址FFFF.FFFF.FFFF,全F的MAC地址是广播地址,同一个网段的网卡都能接收广播;
ARP是有缓存的;
同轴电缆
半双工通信:只允许一个方向发送数据;
网卡拿到MAC地址不是自己的,就会把数据都扔掉;
终结电阻:吸收信号,让信号终结,不会让信号叠加冲突;
有的人可以用抓包工具,抓数据,非常不安全;
集线器(Hub)
模拟器搭建集线器,所有的PC端都会收到,只有特定的才会接收
Hub没有缓存功能,无法实现记忆
设备越多,集线器效率特别低。
模拟器模拟网桥
网桥就只有两个接口,虽然能隔绝一定的计算机,但是效率还是不够高。
模拟器模拟交换机
交换机学习完MAC地址后,就可以杜绝抓包的现象。
路由器
用Packet Tracer模拟路由器
主机发数据之前,首先判断目标IP地址跟我是否在同一个网段
1)在同一个网段:发送ARP,通过交换机\集线器传递数据
2)不在同一个网段:通过路由器转发数据
网关(Gateway):
默认网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP
数据跨网段要先来到网关,路由器就可以实现跨网段
网关要和它所接的那一边的计算机处在同一网段
配置网关IP地址,才能转发数据,否则交换器和路由器连接不上;
PC端也要修改默认网关,否则连接不上路由器,连接上后开始转发数据
我们也一样要通过ARP广播,知道路由器网关的MAC地址,才能传送数据
通过网关跨网段连接,一个网关有IP地址和网卡
每一个网卡都有一个6字节(48bit)的MAC地址(Media Access Control Address)
全球唯一,固化在了网卡的ROM中,由IEEE802标准规定
前3字节:OUI,组织唯一标识符
由IEEE的注册管理机构分配给厂商
后3字节:网络接口标识符
由厂商自行分配
OUI查询
http://standards-oui.ieee.org/oui/oui.txt
https://mac.bmcx.com/
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
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
通常用于返回错误消息
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地址
按位与
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地址的分类
8bit | 24bit |
---|---|
网络ID 0 开头 | 主机ID |
16bit | 16bit |
---|---|
网络ID 10 开头 | 主机ID |
24bit | 8bit |
---|---|
网络ID 110 开头 | 主机ID |
只有A\B\C类地址才能分配给主机
主机ID为全0,表示主机所在的网段
主机ID为全1,表示主机所在网段的全部主机(广播)
网络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
网络ID
可以分配给主机的
第1部分的取值范围是:128~191
第2部分的取值范围是:0~255
主机ID
第3、4部分的取值范围是:2~255
每个B类网络能容纳的最大主机数是:256 * 256 - 2 = 2的16次方 - 2 = 65534
网络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表示方法:
计算工具:https://www.sojson.com/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地址,这种情况属于极大的浪费资源
合理进行子网划分
子网划分
子网划分:借用主机位作子网划分,划分出多个子网
可划分为:
子网划分器:http://www.ab126.com/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类子网划分
Packet Tracer模拟子网段划分
设置两个子网段
当同一子网段时,能够ping通
当不在同一子网段时,ping不通
补充:10.172.168.1/24
上述是A类地址划分的子网段
等长子网划分 — 等分成 个子网的广播地址
变长子网划分
如果一个子网地址的长度是原网段的(1/2)^n,那么
子网的子网掩码,就是在原网段的子网掩码基础上增加n个1
不等长的子网,它们的子网掩码也不同
假设上图是对192.168.0.0/24进行变长子网划分
思考题:
正常通信需要两台设备在同一网段
如果用公式:子网掩码 & IP地址 = 网段
算出来的网段是一样的,都为192.168.0.0
但是并不能成功传送数据
发送数据的时候,是拿自己的子网掩码和对方的IP地址按位与的,所以这样求出来的网段并不相同;
这样一个网段为:192.168.10.0
另一个网段为:192.168.0.0
所以网段不同,这两台电脑并不能正常通信
超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段
需求:原本有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位子网掩码进行合并
比如
判断一个网段是子网还是超网
1.首先
看看该网段的类型,是A类网络、B类网络、C类网络
默认情况下,A类子网掩码的位数是8,B类子网掩码的位数是16,C类子网掩码的位数是24
2.然后
如果该网段的子网掩码位数比默认子网掩码多,就是子网
如果该网段的子网掩码位数比默认子网掩码少,就是超网
3.比如
25.100.0.0/16是一个A类子网
200.100.0.0/16是一个C类超网
在不同网段之间,需要有路由器的支持
默认情况下,路由器只知道跟它直连的网段,非直连的网段需要通过静态路由、动态路由告诉它
静态路由
动态路由
练习1 — 让4台主机之间可以互相通信
用Packet Tracer开始练习
路由表会说明该怎么传送数据
两台路由器之间要传递数据,路由器必须配置静态路由的下一跳;
两个路由器交换时,也需要配置IP地址,来传递数据
开始配置路由表
跨路由器传送数据成功
查看一下路由表,S代表静态、C代表连接。
路由器配置的是某一个网段,只要是我配置的网段的机器,里面都能找到。
路由表也可以配置精确的IP地址。子网掩码全部表示为255,表示一个特定的IP地址。
如果不知怎么走,设置默认路由
数据包的传输过程
这里仅仅是简述一下数据包的传输过程,后面详细学到网络分层时,会再次详细讲解数据包的传输过程
每个地方的接口都有MAC地址,在数据传送的过程中,源MAC地址和目标MAC地址都会发生改变,源IP地址和目标IP地址一直不变。
网络、互联网、因特网
网络:将多台计算机连接起来就组成了网络;
互联网:利用路由器把多个网段连接起来组成的更大的网络;
全世界最大的互联网是:因特网(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的线路。
常见的几种接口
1.电话线入户
这就是平时说的:ADSL电话拨号上网(Asymmetric Digital Subscriber Line)
非对称数字用户线路,提供上、下行不对称的传输带宽
猫(Modem),调制解调器,进行数字信号和模拟信号的转换
公网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类网洛
私网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地址就顺利的发出去了。
网络互连模型
为了更好地促进互联网络的研究和发展,国际化标准组织ISO在1985年制定了网络互联模型
OSI参考模型,具有7层结构
平时我们用的是TCP/IP协议。学习研究看第三个图
网络分层
每一层加装过后,数据就会变换一种名字。每一次可以接收的网络协议也是不同的
物理层定义了接口标准、线缆标准、传输速率、传输方式等
数字信号、模拟信号
数据通信模型
链路:从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抓不到差错校验失败的帧
集线器工作在物理层
网络层数据包(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地址 -| 数据包大小
作用:发送指定大小的数据包
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” - 确定
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首部的选项部分
思考
为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
如果接收方的缓存区满了,发送方还在疯狂发送数据
接收方只能把收到的数据包丢掉,大量的丢包会极大浪费网络资源,所以要进行流量控制。
什么是流量控制?
让发送方的发送速率不要太快,让接收方来得及接收处理
原理
通过确认报文中窗口字段来控制发送方的发送速率
发送方的发送窗口大小不能超过接收方给出的窗口大小。当发送方收到接收窗口的大小为0时,发送方就会停止发送数据
rwnd = receive window = 接收窗口
特殊情况
有一种特殊情况
一开始,接收方给发送方发送了0窗口的报文段,后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了,发送方的发送窗口一直为零,双方陷入僵局
解决方案
当发送方收到0窗口通知时,这时发送方停止发送报文,并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小还是为0,则发送方再次刷新启动定时器
1.拥塞控制
防止过多的数据注入到网络中
避免网络中的路由器或链路过载
2.拥塞控制是一个全局性的过程
涉及到所有的主机、路由器
以及与降低网络传输性能有关的所有因素
是大家共同努力的结果
相比而言,流量控制是点对点通信的控制
链路吞吐量就是可以接收的带宽的大小,在图中是 700M + 600M
拥塞控制是控制整个网络,流量控制是端对端
方法
1.慢开始(slow start,慢启动)
cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK)
cwnd就成倍增长(指数级)
一开始发两个包,然后四个、八个、十六个……,指数级增长
如何知道网络拥塞?
发送发发送过去没有收到对方的确认,说明有些包丢了,网络可能出现拥塞
3.快速重传(fast retransmit)
接收方
每收到一个失序的分组后就立即发出重复确认,使发送方及时知道有分组没有到达,而不要等待自己发送数据时才进行确认
发送方
只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期后再重传
4.快速恢复(fast recovery)
快重传 + 快恢复
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),取两者中最小值
如果我们发送一个HTTP请求给服务器的话,首先要经历三次握手,建立连接
建立连接的时候,传输层首部是32个字节
建立连接的时候双方会确认一些东西,多出一些字节
紫色服务器,蓝色客户端
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包,强制关闭连接
释放连接 - 状态解读
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等
释放连接 - 细节
释放连接 - 疑问
为什么释放连接的时候,要进行4次挥手?
TCP是全双工模式
补充:如何区分长连接和短连接?
短连接:
创建好连接,做完一轮交互,就关闭连接
长连接:
建立完连接不会立马断开,而是持续不断的发送数据,经常进行频繁的数据交互
总结;短连接,数据交互后立马断开。长连接,服务器和客户端数据交互十分的频繁,建立的连接不会立马断开,还是持续不断地进行数据交互。
应用层的常见协议
域名(Domain Name)
由于IP地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了域名(比如baidu.com)
但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的IP地址
域名申请注册:https://wanwang.aliyun.com/
那干脆全程直接用域名,不用IP地址?
IP地址固定4个字节,域名随随便便都至少10几个字节,这无疑会增加路由器的负担,浪费流量
根据级别不同,域名可以分为
1.顶级域名(Top-level Domain,简称TLD)
2.二级域名
3.三级域名
域名 - 顶级域名的分类
通用顶级域名(General Top-level Domain,简称gTLD)
.com(公司),.net(网络机构),.org(组织机构),.edu(教育)
.gov(政府部门),.int(国际组织)等
国家及地区顶级域名(Country Code Top-level Domain,简称ccTLD)
.cn(中国)、.jp(日本)、.uk(英国)
新通用顶级域名(New Generic Top-level Domain,简称:New gTLD)
.vip、.xyz、.top、.club、.shop等
域名 - 二级域名
二级域名是指顶级域名之下的域名
在通用顶级域名下,它一般指域名注册人的名称,例如google、baidu、microsoft等
在国家及地区顶级域名下,它一般指注册类别的,例如com、edu、gov、net等
每个域名都要DNS去管理
DNS
DNS的全称是:Domain Name System,译为:域名系统
利用DNS协议,可以将域名(比如baidu.com)解析成对应的IP地址(比如220.181.38.148)
DNS可以基于UDP协议,也可以基于TCP协议,服务器占用53端口
DNS - 服务器
IP地址的分配
IP地址按照分配方式,可以为静态IP地址、动态IP地址
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 - 细节
1.DHCP服务器可以跨网段分配IP地址吗?(DHCP服务器、客户端不在同一个网段)
可以借助DHCP中继代理(DHCP Relay Agent)实现跨网段分配IP地址
2.自动续约
客户端会在租期不足的时候,自动向DHCP服务器发送REQUEST信息申请续约
3.常用命令
ipconfig /all:可以看到DHCP相关的详细信息,比如租约过期时间、DHCP服务器地址等
ipconfig /release:释放租约
ipconfig /renew:重新申请IP地址、申请续约(延长租期)
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
标准
RFC的部分内容
抓包看一下,这里所有的蓝色的都是HTTP的报文
用Wireshark查看HTTP流,红色的是我们发送给服务器的,蓝色的是服务器返回给我们的。
红色的是请求报文,蓝色的是响应报文
注:查看完整的数据包还是用Wireshark
GET请求是没有实体主体的,POST请求有实体主体。
CRLF意思是回车换行
是BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改,增强版
在RFC 5234中表明:ABNF用作internet中通信协议的定义语言
ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是片面的、不严谨的
关于HTTP报文格式的定义
RFC 2616 A.HTTP Message(旧)
RFC 7230 3.Message Format(新)
报文格式 - 整体
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.com/s?wd=百度
编码后:https://www.baidu.com/s?wd=%E5%8D%8E%E4%B8%BA
Xshell + telnet
安装一个Xshell(安全终端模拟软件),在Xshell中使用telnet
RFC 7231, section 4: Request methods:描述了8种请求方法
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIOUS、TRACE
RFC 5789, section 2: Patch method:描述了PATCH方法
头部字段(Header Field)
头部字段可以分为4种类型
请求头字段
头字段名 | 说明 | 示例 |
---|---|---|
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.com |
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.com |
Cookie | 之前由服务器通过Set-Cookie发送的Cookie | Cookie: $Version=1; Skin=new; |
Connection | 该浏览器想要优先使用的连接类型 | Connection: keep-alive |
Cache-Control | 用来指定在这次的请求 响应链中的所有缓存机制都必须遵守的指令 | Cache-Control: no-cache |
响应头字段
头字段名 | 头字段名 说明 | 示例 |
---|---|---|
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.org |
Set-Cookie | 返回一个Cookie让客户端去保存 | Set-Cookie:UserID=JohnDoe; Max-Age=3600; Version=1 |
Connection | 针对该连接所预期的选项 | Connection: close |
Cache-Control | 向从服务器直到客户端在内的所有缓存机制告知,它们是否可以缓存这个对象。单位为秒 | Cache-Control: max-age=3600 |
在RFC 2616 10.Status Code Definitions规范中定义
状态码指示HTTP请求是否已成功完成
状态码可以分为5类:
有些数值是一直都没有用上的。
每个状态码都有英文描述
常见状态码
403和406的区别,一个是内容一个是类型,403就是有资源,但我不给你,406就是符合请求头要求的资源我没有
表单格式
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的
什么是跨域请求
在HTML中,< a >,< form >,< img >,< scrip t>,< iframe >,< link > 等标签以及Ajax都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:
我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
同源策略
浏览器有个同源策略(Same-Origin-Policy)
它规定了:默认情况下,AJAX请求只能发送给同源的URL
同源是指3个相同的:协议、域名(IP)、端口
img、script、link、iframe、video、audio等标签不受同源策略的约束
跨域资源共享
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来一次次访问的
代理服务器(Proxy Server)
既是服务器又是客户端
特点:
反向代理 - 作用
1.隐藏服务器身份
2.安全防护
3.负载均衡
先请求到负载均衡服务器,根据负载均衡算法,计算出数据给哪一个服务器处理
代理服务器 - 相关的头部字段
CDN(Content Delivery Network或Content Distribution Network),译为:内容分发网络
CDN - 使用CDN前
输入有一个域名,要知道对应的IP地址,就发送到DNS服务器,DNS服务器会告诉我们IP地址,根据IP地址请求到服务器
CDN - 使用CDN后
首先访问网站DNS服务器,它会叫我们去找CDN DNS服务器,这个时候会返回真实的IP地址,会请求到CDN全局负载均衡系统,这里的CDN会决定你拿到哪一台CDN服务器
用户发起请求,最后获得缓存服务器IP,用户就会请求对应的缓存节点,假如用户先请求CDN边缘节点,发现没有想要的东西,就会向上层CDN节点要东西,如果没有的话就会向源站发起请求,源站就把数据返回。
网络通信中面临的4种安全威胁
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欺骗 - 防护
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.防火墙
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劫持,又称为域名劫持
2.为防止DNS劫持,可以考虑使用更靠谱的DNS服务器,比如:114.114.114.114
3.HTTP劫持:对HTTP数据包进行拦截处理,比如插入JS代码
比如你访问某些网站时,在右下角多了个莫名其妙的弹窗广告
HTTP协议的安全问题
1.HTTP协议默认是采取明文传输的,因此会有很大的安全隐患
常见的提高安全性的方法是:对通信内容进行加密后,在进行传输
2.常见的加密方式
常见英文
学前须知
为了便于学习,设计4个虚拟人物呢
1.Alice、Bob:互相通信
2.Eve:窃听者
3.Mallory:主动攻击者
如何防止被窃听
单向散列函数(One-way hash function)
根据任意长度的消息,计算出固定长度的散列值
计算速度快,能快速计算出散列值
单向散列函数,也被称为
消息摘要函数(message digest function)
哈希函数(hash function)
输出的散列值,也被称为
消息摘要(message digest )
指纹(fingerprint)
单向散列函数 - 常见的几种单向散列函数
单向散列函数 - 如何防止数据被篡改
提供一串SHA值,可以把软件包生成散列值,就可以证明是正版的
单向散列函数 - 应用:防止数据被篡改
单向散列函数 - 应用:密码加密
例:如果密码忘记的时候,找回密码,从来没有说把密码重新发给你,而是换一个新密码,因为密码被加密了,是不可逆的。