http协议和tcp三次握手
本文非小马原创,为学习总结笔记,作为日后复盘回顾,感谢原作者分享,文末已注明出处,侵删。
HTTP协议的发展史
(1)HTTP/0.9:这是HTTP协议的最早版本,此版本极为简单,1991年发布。
a.只有一个GET命令
b.没有HEADER等描述数据的信息,服务器只能返回HTML格式的字符串数据
c.服务器发送完毕便立即关闭TCP连接
(2)HTTP/1.0:1996年发布的HTTP/1.0版本相比0.9版本增加了许多内容
a.新增了POST命令和HEAD命令。
b.新增了Status Code和HTTP Header。
c.多字符集的支持、多部分发送、权限和缓存等。
d.缺点是每个TCP连接还是和之前一样,每次只能发送一个请求。数据发送完毕,连接就关闭,如果还要请求其他资源,就必须新建一个连接。
(3)HTTP/1.1: 1997年1月发布了HTTP/1.1版本,此版本只比上一个版本晚了半年。此版本进一步完善了1.0版本HTTP协议。
a.支持持久连接。这是此版本较于上一版本的最大变化。持久连接即为TCP连接在服务器发送完数据默认不关闭,可以被多个请求复用。
b.引入管道机制(Pipelining)。即在同一个TCP连接里面,客户端可以同时发送多个请求。上述两个特性便解决了上面一个版本我们提到的缺点。
c.增加了Host和其他一些命令。Host用来指定服务器域名。有了Host我们便可以在同一物理服务器上运行多个web服务。
(4)HTTP/2 :2015年发布的HTTP/2,注意此版本不叫HTTP/2.0, 是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3。
a.规定所有的数据皆以二进制传输。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
b.引入多工技术。同一个连接里面发送多个请求不再需要按照顺序来。也就是复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应
c.头信息压缩以及推送等提高效率的功能:有效的减少带宽使用。
Http请求和响应格式
http是无状态的协议,只有请求和响应。HTTP工作在TCP之上,HTTP数据包实际上就是TCP包的包体。
Request格式
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:
l 请求方法URI协议/版本
l 请求头(Request Header)
l 请求正文
下面是一个HTTP请求的例子:
GET /barite/account/stock/groups HTTP/1.1
QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCA
DEVICE-TYPE: ANDROID
API-VERSION: 15
Host: shitouji.bluestonehk.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
Response格式
HTTP应答与HTTP请求相似,HTTP响应也由3个部分构成,分别是:
l 协议/版本 状态码 描述
l 响应头(Response Header)
l 响应正文
下面是一个HTTP响应的例子:
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Mon, 15 Oct 2018 03:30:28 GMT
Content-Type: application/json;charset=UTF-8
Pragma: no-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive
{"errCode":0,"message":"success"}
说明一下请求头和响应头的部分字段:
Host:指定服务器域名,可用来区分访问一个服务器上的不同服务
Connection:keep-alive表示要求服务器不要关闭TCP连接,close表示明确要求关闭连接,默认值是keep-alive
Accept-Encoding:说明自己可以接收的压缩方式
User-Agent:用户代理,是服务器能识别客户端的操作系统(Android、IOS、WEB)及相关的信息。作用是帮助服务器区分客户端,并且针对不同客户端让用户看到不同数据,做不同操作。
Content-Type:服务器告诉客户端数据的格式,常见的值有text/plain,image/jpeg,image/png,video/mp4,application/json,application/zip。这些数据类型总称为MIME TYPE。
Content-Encoding:服务器数据压缩方式
Transfer-Encoding:chunked表示采用分块传输编码,有该字段则无需使用Content-Length字段。
Content-Length:声明数据的长度,请求和回应头部都可以使用该字段。
HTTP工作原理
因为HTTP是运行于TCP之上的,所以HTTP的实现同样同甘共苦TCP Socket,客户端向服务器端口发出请求,建立Socket连接,客户请求通过Socket被服务器接受并回应,相应的文档以流的方式通过Socket传给服务器,浏览器解释并显示该文档。
以下是 HTTP 请求/响应的步骤:
1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.lh.com。
2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5. 释放 TCP连接;
6. 浏览器渲染并显示该 html 文本内容;
TCP三次握手
三次握手。
很好记,三次握手z字形三次握手的理解:
1.A向B打招呼,问B,你在吗?(syn)
2.B回答,我在的(ack)。A收到回答(进入estalished状态)。B也问,那你还在吗?(syn)
3.A回答(ack),我还在。B收到回答(进入established状态)。
握手完成后,开始TCP数据传输。接收方都要ack给发送方,如果没得到回复,就要重传,自然也需处理去重。这两项工作操作系统的网络内核模块都已经帮我们处理好了,我们不用理会。
http和TCP区别
1.两个不同层面的协议无法比较。
HTTP是应用层的协议,TCP是传输层协议,IP是网络层协议,本质上没有可比性。
2.何况HTTP协议是基于TCP连接的。
这个比较就好像要比较飞机上的人的速度快还是飞机的速度快一样。人在飞机上,受飞机速度影响,HTTP就好比人,TCP就好比飞机。
通俗的说,
TCP /IP协议就是搬运工,保证搬动的东西不被损坏
保证连接的可靠性,我不管发出任何东西给你,都要有这一套协议来保证不丢包
比如说TCP协议就是这样,无论上层让他传啥数据,他都通过与IP协议的操作,把这些东西分段,然后输送,同时保证在这个过程中,数据不会丢,如果丢了一块,他还得想办法重新传一次。
http协议是做业务的,用来决定要不要搬运,以及如何搬运,从哪去搬运
http里面规定了我们访问网页的时候如何进行缓存,以及请求什么格式。等等,主要是为了让人们访问网页的时候更快,更安全,而规定了很多参数。
那HTTP和TCP分别代表了什么呢?
HTTP的责任是去定义数据,在两台计算机相互传递信息时,HTTP规定了每段数据以什么形式表达才是能够被另外一台计算机理解。
而TCP所要规定的是数据应该怎么传输才能稳定且高效的传递与计算机之间。
HTTP的核心概念
除了HTTP存在于应用层之外,该协议还有5个特点。
1. HTTP的标准建立在将两台计算机视为不同的角色:客户端和服务器。客户端会向服务器传送不同的请求(request),而服务器会对应每个请求给出回应(response)。
2. HTTP属于无状态协议(Stateless)。这表示每一个请求之间是没有相关性的。在该协议的规则中服务器是不会记录任何客户端操作,每一次请求都是独立的。(记录用户浏览行为会通过其他技术实现)
3. 客户端的请求被定义在几个动词意义范围内。最长用到的是GET和POST,其他动词还包括DELETE, HEAD等等。
4. 服务器的回应被定义在几个状态码之间:5开头表示服务器错误,4开头表示客户端错误,3开头表示需要做进一步处理,2开头表示成功,1开头表示在请求被接受处理的同时提供的额外信息。
5. 不管是客户端的请求信息还是服务器的回应,双方都拥有一块头部信息(Header)。头部信息是自定义,其用途在于传递额外信息(浏览器信息、请求的内容类型、相应的语言)。
TCP的核心概念
在HTTP的规范内,两台计算机的交互被视为request和response的传递。而在实际的TCP操作中,信息传递会比单纯的传递request和response要复杂。通过TCP建立的通讯往往需要计算机之间多次的交换信息才能完成一次request或response。
TCP的传输数据的核心是在于将数据分为若干段并将每段数据按顺序标记。标记后的顺序可以以不同的顺序被另一方接收并集成回完整的数据。计算机对每一段数据的成功接收都会做出响应,确保所有数据的完整性。
TCP在传递数据时依赖于实现定义好的几个标记(Flags)去向另一方表态传达数据和连接的状态:
* F : FIN - 结束; 结束会话
* S : SYN - 同步; 表示开始会话请求
* R : RST - 复位;中断一个连接
* P : PUSH - 推送; 数据包立即发送
* A : ACK - 应答
* U : URG - 紧急
* E : ECE - 显式拥塞提醒回应
* W : CWR - 拥塞窗口减少
也是基于这些标志TCP可以实现三次(three ways handshake)和四次握手 (four ways tear down)。三次握手是初步建立连接的机制,而四次握手则是断开链接。两者之间大致操作是一样的,A发出建立链接(SYN)或者断开链接(FIN)的请求,B认可(ACK)其请求然后发出同样的请求给A并等待A的认可。在双方认可后,链接正式成立或者断开。
这里有两个问题:
1. 为什么A发出请求并且得到认可后B还要重复同样的动作?
在建立连接的过程中SYN标记代表的是一个随机序列号,因为当文件被切断的时候并不是从0或者1开始标记每段的顺序,所以双方都需要通过传递SYN来告知文件片段的第一个序列是多少号。
2. 为什么同样的机制,建立链接和断开链接需要握手的次数不同?
三次和四次握手的区别在于,在建立连接时,B的ACK和SYN会一起发送回A,而在断开链接时因为B发送ACK之后还要做其他处理后才能返回FIN,,因此将两步拆开。
四次握手参考文献: