网络基础
一、网络通信基础
1.1 C/S、B/S模型
client server和browser server两种结构。都离不开网络的支持。
1.2 网络通信协议
网络通信协议:通过网络实现计算机连接,双方都必须遵守的协议。
TCP/IP协议:传输控制协议采用四个分层模型,应用层-传输层-网络层-数据链路层、物理层。
1.3 网络通信协议的分类
UDP协议:无连接、不可靠协议。A-B直接发送数据不需要确认也不需要连接。数据限制在64KB以内。
TCP协议:可靠、有连接协议。其中“三次握手”、“四次挥手”是重点。
三次握手:在建立连接时进行三交互,确认连接。
四次挥手:在断开连接时进行四次确认。
详细内容请参考:TCP的三次握手与四次挥手理解及面试题(很全面)
1.4 网络编程三要素
协议
定义:计算机网络通信必须要遵守的规则
IP地址
定义:给网络中的设备唯一的一个编号
IP地址的分类
IPv4:一个32位二进制数,通常分为四个字节a.b.c.d的形式。
IPv6:每16个字节一组,分八组,解决了IP地址不够用的问题。
端口
1024之前的端口号不能使用
取值范围:0-65535之间
常用端口号:
1. 80网络端口号,访问网站的端口号
2. 3306 数据库端口号
3. 8080 tomcat 端口号
二、 TCP通信程序
2.1 概述
分为服务器客户端,
1.服务器必须事先启动
2.客户端主动连接服务器
服务器获取客户端提供的Socket对象中IO流与客户端进行交互。
三、各种网络设备
3.1 网桥
网桥是一种链路层产品,能够记录终端主机的MAC地址和端口的对应,生成CAM表。网桥能够进行冲突域隔离,有效的提高网络带宽利用率,不同接口之间的数据不会相互冲突。
网桥的缺点:接口比较有限,默认是两个接口,对网络的冲突域隔离比较有限,网桥没有专用的硬件而是采用CPU来处理数据,所以处理速度相对较慢
3.2 交换机
交换机(Switch)是网桥演变过来的,所以也是一种链路层产品,交换机一般是用在局域网内数据传送,但是也有广域网交换机。交换机可以隔离冲突域,但是不能隔离广播域。
交换机相比网桥,主要有几个优势:
接口数量更多
采用专用的ASIC硬件芯片进行高速转发,所以速度更快
能够进行VLAN隔离(不仅仅可以隔离冲突域,通过VLAN可以隔离广播域)
3.3 路由器
路由器(Router) 是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。一般路由器有两个部分组成,WAN和LAN,WAN是用来拨号的,是让路由自身能上网的一个部分,LAN是用来局域网内交换数据的,外接的网线插在WAN端口,我们电脑通过网线连接LAN端口,无线路由器的无线部分一般属于LAN,所以一般叫WLAN。路由器内置DHCP服务器,可以为使用路由的电脑自动分配IP,所以他们直接插上就能上网
3.4 三层交换机
三层交换机是二层交换+三层路由,相当于是在二层交换机基础上,增加了路由引擎。
三种转发技术:
进程交换
快速交换,一次路由,多次交换,思想是,某一个流量的第一个报文,需要通过路由引擎进行处理,处理之后 ,转发决定会被缓存在ASIC硬件芯片中,后续流量直接通过ASIC芯片进行快速转发。如果识别同一条数据流(标识数据流的五元组:源目IP、源目端口、协议号)
CEF转发 硬件芯片会自动产生转发表(无关乎流量),所有流量的处理都通过硬件芯片来完成,是最快的转发技术。
交换机的所有接口为二层接口,在配置网关地址时,不能直接在物理接口下配置。那么我们可以针对不同的vlan,配置虚拟接口,比如,针对vlan10,配置虚拟接口,interface vlan 10
但是要注意到三层交换机并不能完全取代路由器,因为它主要是为了实现处于两个不同子网的Vlan进行通讯,而不是用来作数据传输的复杂路径选择
四、HTTP协议通信
HTTP有哪些方法?
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
这些方法的具体作用是什么?
- GET: 通常用于请求服务器发送某些资源
- HEAD: 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源
- OPTIONS: 用于获取目的资源所支持的通信选项
- POST: 发送数据给服务器
- PUT: 用于新增资源或者使用请求中的有效负载替换目标资源的表现形式
- DELETE: 用于删除指定的资源
- PATCH: 用于对资源进行部分修改
- CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
- TRACE: 回显服务器收到的请求,主要用于测试或诊断
GET和POST有什么区别?
- 数据传输方式不同:GET请求通过URL传输数据,而POST的数据通过请求体传输。
- 安全性不同:POST的数据因为在请求主体内,所以有一定的安全性保证,而GET的数据在URL中,通过历史记录,缓存很容易查到数据信息。
- 数据类型不同:GET只允许 ASCII 字符,而POST无限制
- GET无害: 刷新、后退等浏览器操作GET请求是无害的,POST可能重复提交表单
- 特性不同:GET是安全(这里的安全是指只读特性,就是使用这个方法不会引起服务器状态变化)且幂等(幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同),而POST是非安全非幂等
PUT和POST都是给服务器发送新增资源,有什么区别?
PUT 和POST方法的区别是,PUT方法是幂等的:连续调用一次或者多次的效果相同(无副作用),而POST方法是非幂等的。
除此之外还有一个区别,通常情况下,PUT的URI指向是具体单一资源,而POST可以指向资源集合。
举个例子,我们在开发一个博客系统,当我们要创建一篇文章的时候往往用POST https://www.jianshu.com/articles
,这个请求的语义是,在articles的资源集合下创建一篇新的文章,如果我们多次提交这个请求会创建多个文章,这是非幂等的。
而PUT https://www.jianshu.com/articles/820357430
的语义是更新对应文章下的资源(比如修改作者名称等),这个URI指向的就是单一资源,而且是幂等的,比如你把『刘德华』修改成『蔡徐坤』,提交多少次都是修改成『蔡徐坤』
ps: 『POST表示创建资源,PUT表示更新资源』这种说法是错误的,两个都能创建资源,根本区别就在于幂等性
PUT和PATCH都是给服务器发送修改资源,有什么区别?
PUT和PATCH都是更新资源,而PATCH用来对已知资源进行局部更新。
比如我们有一篇文章的地址https://www.jianshu.com/articles/820357430
,这篇文章的可以表示为:
-
article = {
-
author: 'dxy',
-
creationDate: '2019-6-12',
-
content: '我写文章像蔡徐坤',
-
id: 820357430
-
}
当我们要修改文章的作者时,我们可以直接发送PUT https://www.jianshu.com/articles/820357430
,这个时候的数据应该是:
-
{
-
author:'蔡徐坤',
-
creationDate: '2019-6-12',
-
content: '我写文章像蔡徐坤',
-
id: 820357430
-
}
这种直接覆盖资源的修改方式应该用put,但是你觉得每次都带有这么多无用的信息,那么可以发送PATCH https://www.jianshu.com/articles/820357430
,这个时候只需要:
-
{
-
author:'蔡徐坤',
-
}
http的请求报文是什么样的?
请求报文有4部分组成:
- 请求行
- 请求头部
- 空行
- 请求体
- 请求行包括:请求方法字段、URL字段、HTTP协议版本字段。它们用空格分隔。例如,GET /index.html HTTP/1.1。
- 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔
- User-Agent:产生请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
- 请求体: post put等请求携带的数据
http的响应报文是什么样的?
请求报文有4部分组成:
- 响应行
- 响应头
- 空行
- 响应体
- 响应行: 由协议版本,状态码和状态码的原因短语组成,例如
HTTP/1.1 200 OK
。 - 响应头:响应部首组成
- 响应体:服务器响应的数据
聊一聊HTTP的部首有哪些?
内容很多,重点看标『✨』内容
通用首部字段(General Header Fields):请求报文和响应报文两方都会使用的首部
- Cache-Control 控制缓存 ✨
- Connection 连接管理、逐条首部 ✨
- Upgrade 升级为其他协议
- via 代理服务器的相关信息
- Wraning 错误和警告通知
- Transfor-Encoding 报文主体的传输编码格式 ✨
- Trailer 报文末端的首部一览
- Pragma 报文指令
- Date 创建报文的日期
请求首部字段(Reauest Header Fields):客户端向服务器发送请求的报文时使用的首部
- Accept 客户端或者代理能够处理的媒体类型 ✨
- Accept-Encoding 优先可处理的编码格式
- Accept-Language 优先可处理的自然语言
- Accept-Charset 优先可以处理的字符集
- If-Match 比较实体标记(ETage) ✨
- If-None-Match 比较实体标记(ETage)与 If-Match相反 ✨
- If-Modified-Since 比较资源更新时间(Last-Modified)✨
- If-Unmodified-Since比较资源更新时间(Last-Modified),与 If-Modified-Since相反 ✨
- If-Rnages 资源未更新时发送实体byte的范围请求
- Range 实体的字节范围请求 ✨
- Authorization web的认证信息 ✨
- Proxy-Authorization 代理服务器要求web认证信息
- Host 请求资源所在服务器 ✨
- From 用户的邮箱地址
- User-Agent 客户端程序信息 ✨
- Max-Forwrads 最大的逐跳次数
- TE 传输编码的优先级
- Referer 请求原始放的url
- Expect 期待服务器的特定行为
响应首部字段(Response Header Fields):从服务器向客户端响应时使用的字段
- Accept-Ranges 能接受的字节范围
- Age 推算资源创建经过时间
- Location 令客户端重定向的URI ✨
- vary 代理服务器的缓存信息
- ETag 能够表示资源唯一资源的字符串 ✨
- WWW-Authenticate 服务器要求客户端的验证信息
- Proxy-Authenticate 代理服务器要求客户端的验证信息
- Server 服务器的信息 ✨
- Retry-After 和状态码503 一起使用的首部字段,表示下次请求服务器的时间
实体首部字段(Entiy Header Fields):针对请求报文和响应报文的实体部分使用首部
- Allow 资源可支持http请求的方法 ✨
- Content-Language 实体的资源语言
- Content-Encoding 实体的编码格式
- Content-Length 实体的大小(字节)
- Content-Type 实体媒体类型
- Content-MD5 实体报文的摘要
- Content-Location 代替资源的yri
- Content-Rnages 实体主体的位置返回
- Last-Modified 资源最后的修改资源 ✨
- Expires 实体主体的过期资源 ✨
聊一聊HTTP的状态码有哪些?
2XX 成功
- 200 OK,表示从客户端发来的请求在服务器端被正确处理 ✨
- 201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
- 202 Accepted 请求已接受,但是还没执行,不保证完成请求
- 204 No content,表示请求成功,但响应报文不含实体的主体部分
- 206 Partial Content,进行范围请求 ✨
3XX 重定向
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL ✨
- 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
- 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 307 temporary redirect,临时重定向,和302含义相同
4XX 客户端错误
- 400 bad request,请求报文存在语法错误 ✨
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息 ✨
- 403 forbidden,表示对请求资源的访问被服务器拒绝 ✨
- 404 not found,表示在服务器上没有找到请求的资源 ✨
- 408 Request timeout, 客户端请求超时
- 409 Confict, 请求的资源可能引起冲突
5XX 服务器错误
- 500 internal sever error,表示服务器端在执行请求时发生了错误 ✨
- 501 Not Implemented 请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
- 505 http version not supported 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本
同样是重定向307,303,302的区别?
302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码又出来了两个303和307。
303明确表示客户端应当采用get方法获取资源,他会把POST请求变为GET请求进行重定向。 307会遵照浏览器标准,不会从post变为get。
HTTP的keep-alive是干什么的?
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive。
keep-alive的优点:
- 较少的CPU和内存的使用(由于同时打开的连接的减少了)
- 允许请求和应答的HTTP管线化
- 降低拥塞控制 (TCP连接减少了)
- 减少了后续请求的延迟(无需再进行握手)
- 报告错误无需关闭TCP连
为什么有了HTTP为什么还要HTTPS?
https是安全版的http,因为http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP的不安全而生的。
HTTPS是如何保证安全的?
过程比较复杂,我们得先理解两个概念
对称加密:即通信的双方都使用同一个秘钥进行加解密,比如特务接头的暗号,就属于对称加密
对称加密虽然很简单性能也好,但是无法解决首次把秘钥发给对方的问题,很容易被hacker拦截秘钥。
非对称加密:
- 私钥 + 公钥= 密钥对
- 即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密
- 因为通信双方的手里都有一套自己的密钥对,通信之前双方会先把自己的公钥都先发给对方
- 然后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用自己的私钥进行解密
非对称加密虽然安全性更高,但是带来的问题就是速度很慢,影响性能。
解决方案:
那么结合两种加密方式,将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
此时又带来一个问题,中间人问题:
如果此时在客户端和服务器之间存在一个中间人,这个中间人只需要把原本双方通信互发的公钥,换成自己的公钥,这样中间人就可以轻松解密通信双方所发送的所有数据。
所以这个时候需要一个安全的第三方颁发证书(CA),证明身份的身份,防止被中间人攻击。
证书中包括:签发者、证书用途、使用者公钥、使用者私钥、使用者的HASH算法、证书到期时间等
但是问题来了,如果中间人篡改了证书,那么身份证明是不是就无效了?这个证明就白买了,这个时候需要一个新的技术,数字签名。
数字签名就是用CA自带的HASH算法对证书的内容进行HASH得到一个摘要,再用CA的私钥加密,最终组成数字签名。
当别人把他的证书发过来的时候,我再用同样的Hash算法,再次生成消息摘要,然后用CA的公钥对数字签名解密,得到CA创建的消息摘要,两者一比,就知道中间有没有被人篡改了。
这个时候就能最大程度保证通信的安全了。