Http介绍

1. 简介

定义:超文本传输协议,属于应用层

作用:规定了应用进程间通信的准则

特点: 传输效率高,可靠性高,兼容性好,灵活性高

2. 工作方式

  • http协议采用请求/响应的工作方式
  • 具体工作流程如下:


3. Http报文详解

  • HTTP 在应用层交互数据的方式 = 报文
  • HTTP 的报文分为请求报文 & 响应报文

分别用于 发送请求 & 响应请求

3.1 请求报文

3.1.1报文结构

  • HTTP请求报文由请求行、请求头、请求体组成
报文结构
具体介绍
  • 请求行(request line):声明请求方法、主机域名、资源路径、协议版本
  • 请求头(header):声明 客户端、服务器、报文的部分信息
  • 请求体(request body):存放 需发送的数据信息

3.1.2 结构详细介绍

组成1:请求行
  • 作用 声明请求方法、主机域名、资源路径、协议版本
  • 结构 请求行的组成 = 请求方法 + 请求路径 + 协议版本

注:空格不能省

  • 组成介绍


此处特意说明GET、POST方法的区别

  • 示例
    设:请求报文采用GET方法、URL地址 = www.walle.com/walle/index.html ;HTTP1.1版本
    则请求行是:GET/walle/index.html HTTP/1.1
组成2:请求头
  • 作用:声明 客户端、服务器/报文的部分信息
  • 使用方式:采用 “header(字段名):value(值)”的方式
1.请求和响应报文的通用Header
2.常见请求的Header
组成3:请求体
  • 作用:存放 需发送给服务器的数据信息

可选部分:如 GET请求就没有请求数据

  • 使用方式:共3种


至此,关于请求报文的请求行,请求头,请求体讲解完毕

3.2 HTTP响应报文

3.2.1报文结构

-HTTP的响应报文包括:状态行、响应头 & 响应体

报文结构
具体介绍
  • 状态行:声明协议版本、状态码、状态码描述
  • 响应头:声明 客户端、服务器、报文的部分信息
  • 响应体:存放 需发送的数据信息
其中,响应头、响应体与请求报文的请求头、请求体类似。这2种报文的最大的不同在于 状态行&请求行

3.2.2结构详细介绍

组成1:状态行

  • 作用:声明协议版本,状态码,状态描述
  • 组成:状态行有协议版本、状态码&状态信息组成
注:其中空格不能省!!!
  • 具体介绍


  • 状态行 示例:
    HTTP/1.1 202 Accepted(可接受)、HTTP/1.1 404 Not Found(找不到)

组成2: 响应头

  • 作用:声明客户端、服务器/报文的部分信息
  • 使用方式:采用“header(字段名):value(值)”的方式
  • 常用请求头
1.请求和响应报文的通用Header
2.常见响应Header

组成3:响应体

  • 作用:存放需返回给客户端的数据信息
  • 使用方式:和请求体是一致的,同样分为:任意类型的数据交换格式、键值对形式和分部分形式


3.2.3 响应报文总结

3.3 总结

下面,简单总结两种报文结构

请求报文

响应报文

4. 额外知识

下面讲解一些关于HTTP的额外知识:

  • HTTP1.1HTTP1.0的区别
  • HTTPHTTPS的区别
  • HTTP处理长连接的方式

4.1 HTTP1.1与HTTP1.0的区别

HTTP1.1HTTP1.0多了一下优点:

  • 引入持久连接,即 在同一个TCP的连接中可传送多个HTTP请求头&响应
  • 多个请求 & 响应可同时进行、可重叠
  • 引入更多的请求头 & 响应头

如 与身份认证、状态管理 & Cache缓存等机制相关的,HTTP1.0无host字段

4.2 HTTP与HTTPS的区别

4.3 HTTP处理长连接的方式

5 TCP的三次握手和四次挥手

1.比较重要的字段有:

(1)序号(sequence number)Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位位1时,确认序号字段才有效,Ack=Seq+1.
(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN具体含义如下:
URG:紧急指针有效
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
SYN:发起一个新连接
FIN:释放一个连接

2.三次握手

所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的,以下为客户端主动发起连接的图解

[
image.png

]

握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:

(1)首先客户端向服务器端发送一段TCP报文,其中:

  • 标记位为SYN,表示“请求建立新连接”;

  • 序号为Seq=X(X一般为1);

  • 随后客户端进入SYN-SENT阶段。
    (2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:

  • 标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);

  • 序号为Seq=y;

  • 确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;随后服务器端进入SYN-RCVD阶段。
    (3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文。其中:

  • 标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);

  • 序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;

  • 确认号为Ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;

  • 随后客户端进入ESTABLISHED阶段。
    服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。

3.“四次挥手”的详解

所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。以下为客户端主动发起释放连接的图解:


image.png

(1)首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:

  • 标记位为FIN,表示“请求释放连接“;
  • 序号为Seq=U;
  • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。

注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

4.为什么“握手”是三次,“挥手”却要四次?

TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?

  • 建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
  • 释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

所以是“三次握手”,“四次挥手”。

5.为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容