JavaWeb—HTTP协议

HTTP协议超文本传输协议

应用层协议

网络通信,主机之间进行交互信息

HTTP协议落实到日常——>当使用浏览器打开一个网站

浏览器客户端——>HTTP服务器

输入URL—HTTP请求—>

进行交互的时候,就需要先确定“通信协议“

由于互联网通信其实比较复杂,所以各层协议也不知是只有一种,而是很多个协议相互配合

由于协议很多,功能各不相同——所以分类也很多

TCP/IP五层架构

  1. 应用层
  2. 传输层
  3. 网络层
  4. 数据链路层
  5. 物理层

网络通信中的典型模式

  1. 一问一答        Request请求        Response响应
  2. 一问多答
  3. 多问一答
  4. 多问多答

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请求

打开请求详情,可以看到一些特点:

  1. HTTP是一个纯文本的协议
    1. 并不是二进制——>能直接看懂的就是文本,乱码了就是二进制
  2. HTTP的格式是按照行文本的形式

HTTP响应数据

其实也是行文本的,但是为了节省网络传输的带宽,经常会对数据进行压缩——>成二进制

Content-Encoding:gzip        压缩的格式

请求VS响应

观察对比请求和响应,就能看到报文的结构有一些相似之处

响应报文里面包含了页面的HTML

报文结构具体格式

HTTP请求

  1. 首行(请求行)
  2. 请求报头(header)
  3. 空行
  4. 请求正文(body)——>正文部分可以省略

HTTP响应:

  1. 首行(状态行)
  2. 响应报头(header)
  3. 空行
  4. 相应正文(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请求可能会成功,可能会失败,还可能有一些其他的情况可以根据不同的情况,使用不同的状态码来表示

常用状态码:

  1. 200 OK 访问成功,就会出发这个状态码
  2. 404 Not Found 要访问的资源没找到(不存在)
  3. 403 Forbidden 要访问的资源没有权限(例如在git上尝试不登录就访问私有项目)
  4. 500 Internal Server Error 服务器挂了
  5. 302 Move Temporarily    (类似呼叫转移)301,303,304..都能起到重定向的效果  
    1. 浏览器POST请求
    2. 服务器登陆成功302重定向到主页
    3. 浏览器尝试访问重定向之后的地址    Location:地址
    4. 服务器返回重定向之后的页面

状态码小结:

状态码种类繁多

常用就那么几个

状态码也是面试的关键之一

还需要知道状态码分类

HTTP状态码,有一个彩蛋!418状态码——>I'm a teapot 我是一个”茶壶“
418虽然是个恶搞,但是同样切实写入HTTP状态码文档中的

HTTP格式小结:

HTTP请求:

  1. 首行(方法,URL,版本号)
  2. header(每一行是一个键值对,键和值之间使用冒号空格分割)
  3. 空行(header结束标记)
  4. body(GET请求一般没有,POST一般有)

HTTP响应:

  1. 首行(版本号,状态码,状态码的描述)
  2. header(每一行是一个键值对,键和值之间使用冒号空格分割)
  3. 空行(header的结束标记)
  4. 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表面上显示浏览器和操作系统的版本,实际上是,服务器要了解当前的浏览器都支持哪些功能,根据不同功能来决定返回什么样的数据——>如今就没必要这种担心了

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请求,这些请求分别都是来自于哪些用户,服务器就必须要明确的识别出来

客户端&服务器

客户端首次访问/登录操作服务器

  1. 服务器回应请求,带有一个Set-Cookie:sessionId=123给客户端
  2. 客户端拿到值后就会给保存到本地
  3. 用户登陆成功的同时,服务器就会创建出一定的数据结构(Session会话)来保存当前用户的详细信息(服务器同时处理很多客户端请求,针对每个客户端都有各自的Session)
  4. 客户端后续再发起HTTP请求
    就会自动带上Cookie:sessionId=123字段
  5. 服务器收到该请求后,就可以从Cookie中获取到sessionId,就可以查Hash表得到session对象——>获取到该用户所有详细信息、属性

如此之大量的Session通过什么数据结构来保存呢?
通过Hash表
key:sessionId
value:Session对象(包含很多用户的属性——>具体属性针对网站功能而言)

  1. Cookie是啥?
    是一个客户端存储的字符串,里面是键值对结构
  2. Cookie是干啥用的?
    往往可以用来区分用户的身份
  3. Cookie从哪儿来?
    服务器通过Set-Cookie字段返回的,一般是在用户登录成功后返回
  4. Cookie在那里存?
    在客户端存,每个域名下存不同的Cookie
  5. Cookie到哪里去?
     

Cookie不仅仅是网站自己的,也会留有其他网站的Cookie——>可能会给其他网站发请求之类

以码云为例

  1. 首次访问的时候,由于手动清除了Cookie
    登录时发送的POST请求时没有Cookie的
  2. 登录成功后,会在Gitee的服务器生成一个Session,并且给这个Session分配一个唯一的SessionId,并且再把这个SessionId和Sesion以键值对的形式插入到Hash表中,返回的HTTP响应中就带有了Set-Cookie字段
  3. 那么下次再请求Gitee,就会自动带着这个Cookie的数据

区分Cookie和Session!

Cookie是客户端的概念
Session是服务器的概念

到了Servlet部分会继续深入Cookie与Session

HTTPS

HTTPS就是基于HTTP引入了一套加密方案

加密:
本来要传递的信息——>明文
为了保证数据安全——>需要对明文进行加密——>按照一定的规则把明文字符串进行变换,得到一串加密之后的"密文"

解密:
拿到密文后,要进行解密
针对密文字符串进行一系列规则的变换——>得到明文字符串

加密解密过程中,一个重要的角色——>密钥(yue)!——>展开来讲:密码学

对称加密:加密解密同一份密钥

非对称加密:一个公钥一个私钥

使用公钥加密,私钥解密

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值