- 网络协议
- 第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
思考:数据是如何从一个设备传递到另一个设备的?
这一切都是由网络协议来规定的。没有网络协议,就没有今天的互联网
- 互联网、移动互联网、物联网,都离不开网络协议
- 最熟悉的网络协议: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会拿到应用层数据。
服务器返回数据也是一层一层加装,然后客户端一层一层解封;
不管什么网络协议,都是按照上图的标准发送接收数据的;
使用IDEA,创建新项目和web服务器功能,web文件就给客户端提供的资源,在web文件夹下新建文件
安装服务器软件Tomcat,利用端口,启动部署Tomcat
通过划线的路径,访问到项目里面的资源
http://IP地址:端口号/资源路径
http://127.0.0.0:8080/csw 相当于访问到web文件夹
启动Tomcat,启动成功。
直接访问项目名的话会直接访问里面的index.html、index.htm、index.jsp等文件
访问服务器里面的资源
完成登录注册操作
引用外部的库
通信首先要知道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地址和网卡
每一个网卡都有一个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 -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地址(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开头,保留至今后使用
只有ABC类地址才能分配给主机
主机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.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地址,这种情况属于极大的浪费资源
合理进行子网划分
子网划分
子网划分:借用主机位作子网划分,划分出多个子网
可划分为:
- 等长子网划分:将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的
- 变长子网划分:每个子网的可用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类子网划分
等长子网划分 — 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
所以网段不同,这两台电脑并不能正常通信
超网:跟子网反过来,它是将多个连续的网段合并成一个更大的网段
需求:原本有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地址一直不变。
网络、互联网、因特网
网络:将多台计算机连接起来就组成了网络;
互联网:利用路由器把多个网段连接起来组成的更大的网络;
全世界最大的互联网是:因特网(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类网洛
私网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协议。学习研究看第三个图
请求过程
客户端一层层加装,服务器再一层层解封装。
网络分层
每一层加装过后,数据就会变换一种名字。每一次可以接收的网络协议也是不同的
物理层定义了接口标准、线缆标准、传输速率、传输方式等
数字信号、模拟信号
- 模拟信号(Analog Signal)
连续的信号,适合长距离传输
抗干扰能力差,受到干扰时波形变形很难纠正
- 数字信号(Digital Signal)
离散的信号,不适合长距离传输
抗干扰能力强,受到干扰时波形失真可以修复
数据通信模型
- 局域网通信模型
注意:网线不能超过100米 - 广域网通信模型
信道
信道:信息传输的通道,一条传输介质上(比如网线)上可以用有多条信道 - 单工信道
信号只能往一个方向传输,任何时候都不能改变信号的传输方向
比如无线电广播、有线电视广播 - 半双工通信
信号可以双向传输,但必须是交替进行,同一个时间只能往一个方向传输
比如对讲机 - 全双工通信
信号可以同时双向传输
比如手机(打电话,听说同时进行)
链路:从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地址 -| 数据包大小
作用:发送指定大小的数据包
图上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” - 确定
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对齐
TCPUDP的数据长度,完全可以由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
思考
为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
- 因为可以提高重传的性能
- 需要明确的是:可靠传输是在传输层进行控制的
如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可
如果接收方的缓存区满了,发送方还在疯狂发送数据
接收方只能把收到的数据包丢掉,大量的丢包会极大浪费网络资源,所以要进行流量控制。
什么是流量控制?
让发送方的发送速率不要太快,让接收方来得及接收处理
原理
通过确认报文中窗口字段来控制发送方的发送速率
发送方的发送窗口大小不能超过接收方给出的窗口大小。当发送方收到接收窗口的大小为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.滑动窗口
就是接收窗口滑动
如果我们发送一个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包,强制关闭连接
释放连接 - 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事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没有收到服务器的心跳包,则认为连接不可用。
注意:心跳包一般都是很小的包,或者只包含包头的一个空包
补充:如何区分长连接和短连接?
短连接:
创建好连接,做完一轮交互,就关闭连接
长连接:
建立完连接不会立马断开,而是持续不断的发送数据,经常进行频繁的数据交互
总结;短连接,数据交互后立马断开。长连接,服务器和客户端数据交互十分的频繁,建立的连接不会立马断开,还是持续不断地进行数据交互。
应用层的常见协议
- 超文本传输:HTTP、HTTPS
- 文本传输:FTP
- 电子邮件:SMTP、POP3、IMAP
- 动态主机配置:DHCP
- 域名系统:DNS
域名(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的全称是:Domain Name System,译为:域名系统
利用DNS协议,可以将域名(比如baidu.com)解析成对应的IP地址(比如220.181.38.148)
DNS可以基于UDP协议,也可以基于TCP协议,服务器占用53端口
用Wireshark抓包
DNS -常用命令
- ipconfig/displaydns:查看DNS缓存记录
- ipconfig/flushdns:清空DNS缓存记录
3.ping域名
4.nslookup 域名
IP地址的分配
IP地址按照分配方式,可以为静态IP地址、动态IP地址
- 静态IP地址
手动设置
适用场景:不怎么挪动的台式机(比如学校机房中的台式机)、服务器等 - 动态IP地址
从DHCP服务器自动获取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 - 4个阶段
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
标准
- 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文件的提交协议
报文格式



