Skip to main content

[Http] 大话Http(上)

TCP/IP 协议族及 4 层分层​

TCP/IP 协议其实是一系列与互联网相关联的协议集合起来的总称, 分层管理是 TCP/IP 协议的重要特征

TCP/IP 协议族分层​

tcp

应用层​

yingyong

传输层​

chuanshu

网络层​

chuanshu

链路层​

chuanshu

数据包的封装过程​

fengbao

传输层-tcp 三次握手​

woshou

第一次握手​

first

第二次握手​

second

第三次握手​

third

HTTP 事务处理过程​

chuli

chulixiangxi

以 winshark 抓包某网站分析三次握手:

首先通过 dns 解析找到 ip 地址, 接下来客户端端口到 80 端口, 也就是 tcp 传输层的三次握手, 接下来访问某 http 请求, 如果下次再访问发现都是很快关闭再次 3 次握手再次获取

HTTP 协议特点​

支持客户/服务器模式​

客户/服务器模式工作的方式是由客户端向服务器发出请求, 服务器端响应请求, 并进行相应服务

简单快速​

  • 客户向服务器请求服务时, 只需传送请求方法和路径
  • 由于 HTTP 协议简单, 使得 HTTP 服务器的程序规模小, 因而通信速度很快

灵活​

  • HTTP 允许传输任意类型的数据对象

  • 正在传输的类型由 Content-Type (Content-Type 是由 HTTP 包中用来表示内容类型的标识)加以标记

无连接​

  • 无连接的含义是限制每次连接只处理一个请求
  • 服务器处理完客户的请求, 并收到客户的应答后, 即断开连接
  • 采用这种方式可以节省传输时间

无状态​

  • HTTP 协议是无状态协议
  • 无状态是指协议对于事务处理没有记忆能力, 缺少状态意味着如果后续处理需要前面的信息, 则它必须重传, 这样可能导致每次连接传送的数据量增大
  • 另一方面, 在服务器不需要先前信息时它的应答就较快

URI 与 URL​

我们在浏览器地址栏里输入的地址应该叫URL还是URI?​

答案: URI = URL + URN 来自官方标准文档

URI​

URI: 一个紧凑的字符串用来标示抽象或物理资源

URI 可以进一步被分为定位符, 名字或两者都是

术语"Uniform Resource Locator" (URL)是 URI 的子集, 除了确定一个资源, 还提供一种定位该资源的主要访问机制(如其网络"位置")

URL​

URI 可以分为 URL, URN 或同时具备 locators 和 names 特性的一个东西

URN 作用就好像一个人的名字, URL 就像一个人的地址

换句话说: URN 确定了东西的身份, URL 提供了找到它的方式

URI 和 URL 最大的差别是"访问机制"

URN 是唯一标识的一部分, 是身份信息

HTTP 报文结构分析​

baowen

HTTP 报文头​

  • HTTP 的报文头大体可以分为四类, 分别是:

    • 通用报文头
    • 请求报文头
    • 响应报文头
    • 实体报文头
  • HTTP/1.1 里一共规范了 47 种报文头字段

通用报文头​

可以在请求头和响应头中使用

tongyong

请求报文头​

qingqiu

  • Accept 作用: 浏览器端可以接受的媒体类型

Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的 html 文档, 如果服务器无法返回 text/html 类型的数据, 服务器应该返回一个 406 错误(Non Acceptable). 现在多数是 Accept: */* 代表浏览器可以处理所有类型

如果想要给显示的媒体类型增加优先级, 则使用 q= 来额外表示权重值; 重值 q 的范围是 0 - 1(可精确到小数点后三位), 1 为最大值, 不指定权重 q 值时, 默认权重为 q=1.0. 当服务器提供多种内容时, 将会首先返回权重值最高的媒体类型.

  • Accept-Encoding

作用: 浏览器申明自己接收的编码方法, 通常指定压缩方法, 是否支持压缩, 支持什么压缩方法(gzip, deflate)

Accept-Encoding: gzip, deflate

  • Accept-Language

作用: 浏览器申明自己接收的语言

Accept-Language: zh-cn, zh; q=0.7, en-us, en;q=0.3

客户端再服务器有中文版资源的情况下, 会请求其返回中文版对应的相应, 没有中文版时, 则请求返回英文版响应

  • Connection

Connention: keep-alive 当一个网页打开完成后, 客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭, 如果客户端再次访问这个服务器上的网页, 会继续使用这一条已经建立的连接. 节省 3 次握手的浪费

Connention: close 代表一个 Request 完成后, 客户端和服务器之间用于传输 HTTP 数据的 TCP 连接会关闭, 当客户端再次发送 Request, 需要重新建立 Tcp 连接

  • Host

作用: 请求报头域主要用于指定被请求资源的 Internet 主机和端口号, 它通常从 HTTP URL 中提取出来的

我们在浏览器中输入: http://www.xxx.com:8080

浏览器发送的请求消息中, 就会包含 Host 请求报头域, 如下: Host: www.xxx.com:8080

  • Referer

当浏览器向 web 服务器发送请求的时候, 一般会带上 Referer, 告诉服务器我是从哪个页面链接过来的, 服务器籍此可以获得一些信息用于处理

  • User-Agent

作用: 告诉 HTTP 服务器, 客户端使用的操作系统和浏览器的名称和版本

  • Content-Type

作用: 说明了报文体内对象的媒体类型

text/html

image/xxx

application/xxx

响应报文头​

xiangying

实体报文头​

shiti

HTTP 请求方法剖析​

HTTP/1.1 常用方法

  1. get
  2. post
  3. put
  4. head
  5. delete
  6. options
  7. trace
  8. connect

类似于 get 请求, 只不过返回的响应中没有具体的内容, 用于获取报头

多用来测试连接能不能访问, 最近是否有更新

delete​

请求服务器删除指定的资源

options​

用来查询针对请求 URI 指定的资源支持的方法

options

trace/connect​

回显服务器收到的请求, 主要用于测试或诊断

connect​

开启一个客户端与所请求资源之间的双向沟通的通道, 它可以用来创建隧道

状态码​

是用以表示网页服务器超文本传输协议响应状态的 3 位数字代码

常用状态码​

200

300

400

500

状态机制​

cookie 实际上是一小段的文本信息, 客户端请求服务器, 如果服务器需要记录该用户状态, 就向客户端浏览器颁发一个 cookie, 客户端浏览器会把 cookie 保存起来, 当浏览器再请求该网站时, 浏览器把请求的网址连同该 cookie 一同提交给服务器, 服务器检查该 cookie, 以此来辨认用户状态

cookie

Session​

Session 是另一种记录客户状态的机制, 保存在服务器上, 客户端浏览器访问服务器的时候, 服务器把客户端信息以某种形式记录在服务器上

客户端浏览器再次访问时只需要从该 session 中查找该客户端的状态就可以了

session

保存 session id 的方式​

  • cookie

  • url 重写

    • 比如: http://../xxx;Sessionid=DFSJKJFKSJJSDFJKJLJL 或作为查询字符串 http://../xxx?Sessionid=DFSJKJFKSJJSDFJKJLJL
  • 隐藏表单

Session 的有效期​

  • Session 超时失效

  • 调用 HttpSession.invalidate()

  • 服务器进程被终止

  • 存放位置不同

    • cookie 保存在客户端, session 保存在服务端
  • 安全性(隐私策略)不同

    • cookie 保存在浏览器, 客户端可见, 容易被篡改
    • session 存储在服务器上, 对客户端来说透明, 不会泄露敏感信息
  • 有效期不同

    • cookie 可长时间
    • session 在服务器端需要定时清理