HTTP协议超文本传输协议
应用层协议
网络通信,主机之间进行交互信息
HTTP协议落实到日常——>当使用浏览器打开一个网站
浏览器客户端——>HTTP服务器
输入URL—HTTP请求—>
进行交互的时候,就需要先确定“通信协议“
由于互联网通信其实比较复杂,所以各层协议也不知是只有一种,而是很多个协议相互配合
由于协议很多,功能各不相同——所以分类也很多
TCP/IP五层架构
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
网络通信中的典型模式
- 一问一答 Request请求 Response响应
- 一问多答
- 多问一答
- 多问多答
URL资源唯一定位符
就是俗称的网址
描述了互联网上的资源的位置(HTML、CSS、JS、图片、视频...)
URL的登录信息(认证)部分——>几乎没有网站通过这种方式来认证登录了
毕竟在URL历面按照固定的格式来写用户名密码,用户体验较差——>登录功能都是登录页面实现
URL中的服务器地址
描述了互联网上的一个服务器的位置
此处的地址其实也就是IP地址
域名——>域名和IP地址是等价的关系,通过域名自动转换成一个对应的IP地址
IP地址:通过点分十进制的方式把IP地址分成四个十进制的整数,每个整数的范围0~255
域名会通过DNS机制自动转成IP地址
引入域名的目的就是为了好记所以现在搭建网站都会申请一个域名——>网络供应商提供域名的服务
已知域名想查看IP地址,可以通过ping命令
ping v.bitedu.vip
.
域名除了好记之外,
如果服务器这边进行了系统升级,ip发生了变化,对于客户来说没有影响
URL中的端口号
用以确定服务器上的一个具体的应用程序(进程)
URL中的端口号是可以省略的,不过如果省略了,浏览器会自动加上一个端口号(端口号在进行网络通信的时候还是非常必要的)
端口号具体如何,是与协议类型密切相关的
如果HTTP协议,自动加端口号80
如果HTTPS协议,自动加端口号443固定规则
HTTP服务器通常部署在80端口
HTTPS服务器通常部署在443端口(约定俗成)这样的规则并不是硬性要求,也完全可以把服务器部署在其他端口上,功能层面是没影响的,只不过需要显式的标记端口号(不能隐藏)
URL中带层次的路径
对应到服务器上的一个具体的资源
一个服务器上管理的资源非常多
类似于磁盘上的目录结构
每个路径都对应了服务器上的不同资源
不同路径下用户看到的结果内容也是不相同的
针对搜狗主页
通过/路径访问到的主页是干净的主页
通过/index.html路径访问到的主页是带小广告的主页——>多用于网吧
查询字符串
query string查询字符串——>重要组成部分
以?作为起始标记,分割路径和查询字符串部分——>可以理解成键值对的形式
键值对可以很多,具体有哪些键,对应的值都有什么还以,都是程序员自己设定的
HTTP协议之所以能广泛使用,也和自身很强大的扩展性密切相关
程序员可以基于HTTP协议来传输一些自己定制的信息
如果URL里面?固定就是用于表示路径和查询字符串之间的分界
此时如果查询字符串中也存在?,看就会导致服务器解析URL出错
以搜狗为例,本来查询词是出现在query string中的,二u过用户搜索了?,?也就会出现在query string历面,为了防止服务器解析失败,就会把? = > %3F
这个转义的过程就称为”url encode“,如果是把%3F还原回?,就称为”url decode“
此处可以参与转义的符号很多,包括不限于各种ascii符号、中文汉字
针对汉字来转义,汉字常见使用utf8编码
一个汉字转义成为3个字节
urlencode就是把这三个字节每个字节都是用十六进制表示,并且在前面加上一个%
片段标识符
通过#字符串来表示,一般适用于在一个网站内不同模块之间的跳转
有些访问党的网站中,一个页面比较长,内容多
就可以通过片段标识,在页面中的不同部分之间进行跳转(类似通过目录跳转)
HTTP和HTTPS
完全不同的两个协议
基本原理相同,但是https多了一个加密的过程
因而,http可以直接申请——>不安全,而https则需要一定的数字签名——>安全
所以现在互联网上大部分的网站都是https的了
HTTP格式
协议即约定,约定了请求和响应里面都是按照什么样的结构来进行组织数据的
要了解HTTP就是需要研究协议格式——>抓包工具
常用抓包工具:
wireshark
tcpdump
fiddler——>学习
fiddler
费德勒是什么?
介于服务器和浏览器之间的代理程序(中间商),从他那走一趟——>留下记录
刷新浏览器的请求
raw标签,就可以看到最原始的HTTP请求
打开请求详情,可以看到一些特点:
- HTTP是一个纯文本的协议
- 并不是二进制——>能直接看懂的就是文本,乱码了就是二进制
- HTTP的格式是按照行文本的形式
HTTP响应数据
其实也是行文本的,但是为了节省网络传输的带宽,经常会对数据进行压缩——>成二进制
Content-Encoding:gzip 压缩的格式
请求VS响应
观察对比请求和响应,就能看到报文的结构有一些相似之处
响应报文里面包含了页面的HTML
报文结构具体格式
HTTP请求
- 首行(请求行)
- 请求报头(header)
- 空行
- 请求正文(body)——>正文部分可以省略
HTTP响应:
- 首行(状态行)
- 响应报头(header)
- 空行
- 相应正文(body)——>正文部分可以省略
HTTP请求
首行
CONNECT(请求方法) www.nowcoder.com:443(请求的URL) HTTP/1.1(HTTP的版本号)
HTTP协议中的请求方法很多,,最常用的就是GET和POST,除此之外,还有一些PUT DELETE HEAD OPTIONS...
GET方法一般用于从服务器获取数据(大多数情况下,但并不绝对)
POST方法一般用于往服务器提交数据(大多数情况下,但并不绝对)HTTP版本号当前主要有
- HTTP/1.0
- HTTP/1.1——>当前最常见
- HTTP/2
- HTTP/3
请求头——>键值对
Host: www.nowcoder.com:443
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36
用以描述HTTP请求的一些属性
每个键值对占一行,键值之间使用:空格来分割
不同请求头,代表不同含义,具体多少个请求头,并不固定,以下一个空行作为结束标记
请求正文(body)
对于HTTP的GET请求来说一般没有body——>可以有query string
对于HTTP的POST请求来说一般有body——>一般没有,需要给服务器的信息都是放在body一般登录页面,用户输入的用户名和密码,往往就是通过POST请求来提交的l
对于GET和POST来说,本身在进行数据传输的时候,都是不安全的(抓包直接能看到用户名密码)
HTTP响应
首行,三个部分,使用 空格 分割
HTTP/1.1(版本号) 200(状态码) OK(状态码的描述)
状态码
一次HTTP请求可能会成功,可能会失败,还可能有一些其他的情况可以根据不同的情况,使用不同的状态码来表示常用状态码:
- 200 OK 访问成功,就会出发这个状态码
- 404 Not Found 要访问的资源没找到(不存在)
- 403 Forbidden 要访问的资源没有权限(例如在git上尝试不登录就访问私有项目)
- 500 Internal Server Error 服务器挂了
- 302 Move Temporarily (类似呼叫转移)301,303,304..都能起到重定向的效果
- 浏览器POST请求
- 服务器登陆成功302重定向到主页
- 浏览器尝试访问重定向之后的地址 Location:地址
- 服务器返回重定向之后的页面
状态码小结:
状态码种类繁多
常用就那么几个
状态码也是面试的关键之一
还需要知道状态码分类
HTTP状态码,有一个彩蛋!418状态码——>I'm a teapot 我是一个”茶壶“
418虽然是个恶搞,但是同样切实写入HTTP状态码文档中的
HTTP格式小结:
HTTP请求:
- 首行(方法,URL,版本号)
- header(每一行是一个键值对,键和值之间使用冒号空格分割)
- 空行(header结束标记)
- body(GET请求一般没有,POST一般有)
HTTP响应:
- 首行(版本号,状态码,状态码的描述)
- header(每一行是一个键值对,键和值之间使用冒号空格分割)
- 空行(header的结束标记)
- body(常见的就是HTML响应)
HTTP协议的核心内容:
只要浏览器按照这样的格式构造一个字符串,发送给服务器,就相当于是”发送了一个HTTP请求“
服务器也是构造一个符合这种格式的字符串,返回给浏览器,就相当于是”返回了一个HTTP响应“浏览器可以访问不同的网站,每个网站都是独立的HTTP服务器
之所以浏览器能够访问并解析各种不同的服务器结果,就是因为所有的HTTP服务器和所有的浏览器,都遵守HTTP协议
以搜狗为例:
GET https://www.sogou.com/web?query=%E9%98%BF%E6%96%AF%E9%A1%BF&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=2083&sst0=1624778492958&lkt=0%2C0%2C0&sugsuv=1624776874781563&sugtime=1624778492958 HTTP/1.1
Host: www.sogou.com
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://www.sogou.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: ABTEST=0|1624776874|v17; IPLOC=CN6101; SUID=3C8916755053A00A0000000060D820AA; SUV=1624776874781563; browerV=3; osV=1; taspeed=taspeedexist; SNUID=B4019EFD888C4C3051192249899507F8; ld=jyllllllll2kLjj7lllllpRYw3DlllllNSzJ5lllllwlllllpZlll5@@@@@@@@@@
如果看到形如此类URL,省略了域名
默认访问的服务器地址,就和当前HTML所在的地址一致
Connection:keep-alive 表示浏览器和服务器之间,使用长连接(与之相对,短连接)
HTTP协议,也是基于TCP协议的(HTTP3不是基于TCP)
User-Agent解析:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36
简称UA,里面包含了用户的设备的操作系统和浏览器的类型和版本
UA现在主要用来区分手机和电脑
对于上世纪末而言,互联网刚刚出现->浏览器功能十分单一,只能访问文本,后来浏览器功能才逐渐增强——>所以UA表面上显示浏览器和操作系统的版本,实际上是,服务器要了解当前的浏览器都支持哪些功能,根据不同功能来决定返回什么样的数据——>如今就没必要这种担心了
Refer
Referer: https://www.sogou.com/
典型用处
网站广告系统,就涉及到一个重要问题——计费!
网站投放广告
怎么统计一天里面某个网站一共点击了多少下?网站方和广告公司都统计!
网站统计:当我们点击页面链接时,其实就是先给网站发送了一个HTTP请求,网站的服务器返回一个重定向的HTTP响应,然后再跳转到广告公司的页面
广告公司统计:广告公司的HTTP服务器也可以获取到自己的网站被访问多少次注意:广告公司服务器的HTTP请求,其实是来自于很多渠道,投放广告又不可能只投一家网站,所以这里要用到Refer来区分来源
由于HTTP协议,都是明文传输的,每个HTTP请求,的header部分(包括refer)都是明文的
此时就可能被第三方接获这个请求,并进行篡改,比如refer给改了
这件事——很可能是运营商(移动,联通,电信)干的——服务就是人家提供的,想截获修改相当的轻松——>运营商劫持!!! (2015年时这个情况非常猖獗)
所以说!https——>应运而生!.
Content
Content-Length:385(body的长度(字节))
Content-Type:application/x-www-form-urlencoded(body的数据格式)
Content-Type常见取值:
- x-www-from-urlencoded:body是按照类似于query string的方式来组织数据的
- text/html:body是按照HTML来组织的
- text/plain:纯文本结构
- text/css:css格式的数据
- text/gif:body是一个gif
- image/gif:body就是要给gif
- image/jpg:body就是一个jpg格式的文件
- application/javascript:body就是JS文件
Cookie
Cookie: ABTEST=0|1624776874|v17; IPLOC=CN6101; SUID=3C8916755053A00A0000000060D820AA; SUV=1624776874781563; browerV=3; osV=1; taspeed=taspeedexist; SNUID=B4019EFD888C4C3051192249899507F8; ld=jyllllllll2kLjj7lllllpRYw3DlllllNSzJ5lllllwlllllpZlll5@@@@@@@@@@
Cookie是一个字符串——>键值对结构的字符串——>浏览器里面保存着(每个域名/地址下都有自己的Cookie)
Cookie的内容来自于服务器
Cookie会在下次请求的时候,请求中会自动加上Cookie这个字段,字段里的值就是之前从服务器返回的值
键与值之间 = 分割,键值对之间 ; 分割——>有哪些键值都是开发人员约定好了的
访问百度、访问搜狗、等等,Cookie都是各自独立的
Cookie的内容来自于服务器
HTTP响应中,有一个/多个Set-Cookie字段。里面的内容会被浏览器保存下来
Cookie的作用:
最典型的就是识别用户的身份
注意:服务器同一时刻会收到大量的HTTP请求,这些请求分别都是来自于哪些用户,服务器就必须要明确的识别出来
客户端&服务器
客户端首次访问/登录操作服务器
- 服务器回应请求,带有一个Set-Cookie:sessionId=123给客户端
- 客户端拿到值后就会给保存到本地
- 用户登陆成功的同时,服务器就会创建出一定的数据结构(Session会话)来保存当前用户的详细信息(服务器同时处理很多客户端请求,针对每个客户端都有各自的Session)
- 客户端后续再发起HTTP请求
就会自动带上Cookie:sessionId=123字段 - 服务器收到该请求后,就可以从Cookie中获取到sessionId,就可以查Hash表得到session对象——>获取到该用户所有详细信息、属性
如此之大量的Session通过什么数据结构来保存呢?
通过Hash表
key:sessionId
value:Session对象(包含很多用户的属性——>具体属性针对网站功能而言)
- Cookie是啥?
是一个客户端存储的字符串,里面是键值对结构- Cookie是干啥用的?
往往可以用来区分用户的身份- Cookie从哪儿来?
服务器通过Set-Cookie字段返回的,一般是在用户登录成功后返回- Cookie在那里存?
在客户端存,每个域名下存不同的Cookie- Cookie到哪里去?
Cookie不仅仅是网站自己的,也会留有其他网站的Cookie——>可能会给其他网站发请求之类
以码云为例
- 首次访问的时候,由于手动清除了Cookie
登录时发送的POST请求时没有Cookie的 - 登录成功后,会在Gitee的服务器生成一个Session,并且给这个Session分配一个唯一的SessionId,并且再把这个SessionId和Sesion以键值对的形式插入到Hash表中,返回的HTTP响应中就带有了Set-Cookie字段
- 那么下次再请求Gitee,就会自动带着这个Cookie的数据
区分Cookie和Session!
Cookie是客户端的概念
Session是服务器的概念到了Servlet部分会继续深入Cookie与Session
HTTPS
HTTPS就是基于HTTP引入了一套加密方案
加密:
本来要传递的信息——>明文
为了保证数据安全——>需要对明文进行加密——>按照一定的规则把明文字符串进行变换,得到一串加密之后的"密文"解密:
拿到密文后,要进行解密
针对密文字符串进行一系列规则的变换——>得到明文字符串加密解密过程中,一个重要的角色——>密钥(yue)!——>展开来讲:密码学
对称加密:加密解密同一份密钥
非对称加密:一个公钥一个私钥
使用公钥加密,私钥解密