HTTP是基于应用层的协议,然后由TCP在传输层进行传输。通俗的说HTTP是基于TCP协议的。
对于HTTP协议感觉就是一头雾水,虽然知道这是为了统一标准而定下的协议,但是这个协议它是怎样工作的呢。
举一个例子,当我们在浏览器中输入URL访问资源,这个时候浏览器会根据HTTP协议将相关数据进行打包,然后交给TCP协议。TCP协议根据数据包信息对服务器发起请求,并进行三次握手,简历客户端和服务器的通信通道。
第一次握手:客户端发送SYN标识报文,seq=X到服务器(SYN数据包),客户端进入SYN_SEND状态
第二次握手:服务器接收到客户端的请求,发送确认信息SYN,ACK报文,seq=y,ACK=X+1给客户端(SYN+ACK数据包)。服务器进入SYN_RECV状态
第三次握手:客户端确认服务器信息,并返回确认信息ACK报文给服务器端ACK=Y+1,seq=x(ACK数据包)。客户端和服务器进入ESTABLISHED状态。
三次握手指挥客户端可以跟服务器进入数据传输。
关于TCP标识的含义
SYN:建立连接
FIN:关闭连接
ACK:标识响应
PSH:有DATA数据传输
RST:连接重置
为什么需要三次握手,比如不能改成两次或者一次吗?
目的是因为尽可能的减少服务器的开销,比如,发起请求,请求在发送路上遇到阻塞,超时才发送到服务器端。这个时候客户端已经放弃了这个请求了,如果这个时候接收到延迟的请求,直接处理并返回给客户端。这样浪费了服务器资源在处理一个无效请求得不偿失。
HTTP请求与TCP传输的关系
当客户端与服务器通过三次握手之后,建立起连接之后,一个TCP连接可以发送多个HTTP请求。这样就不用说每个请求都需要重新握手消耗资源。
TCP的四次挥手:
第一次挥手:客户端发送一个FIN=X标识数据包,表示关闭客户端到服务器的数据传送
第二次挥手:服务器端发送一个ACK包确认数据包ACK=X+1
第三次挥手:服务器端发送一个FIN=Y标识数据包,表示服务器关闭到客户端的数据传送
第四次挥手:客户端发送一个ACK包确认数据包ACK=Y+1
完成四次挥手,连接就中断了。
为什么需要四次挥手?
TCP连接是一个全双工通道,需要客户端和服务器端分别发送关闭连接的请求。而且是四次挥手之后双方才真正关闭连接,因为这四次握手中,需要客户端和服务器端互相发送FIN请求跟响应。
请求头的基本组成:
方法 URL 协议版本
首部字段名
(换行)
消息主体
GET /api/test1 HTTP/1.1
HOST:www.baidu.com
......
<html>
<body>
Hello,test1
</body>
</html>
响应头:
协议版本 状态 短语
首部字段名
....
(换行)
消息主体
HTTP/1.1 200 OK
Date:时间
.....
<html>
<body>
How are you?
</body>
</html>
常用请求方法:
Restful标准中的含义:
GET:获取一个资源
POST:创建一个资源
PUT:更新一个资源
DELETE:删除一个资源
未完待续......