HTTP是一个基于TCP协议的应用层协议,由请求和响应构成,另外还有HTTPS,是以安全为目标的HTTP通道,是HTTP协议加上SSL协议层的安全加密传输,另外TLS也是SSL的升级(具体关系不详细说,有兴趣的同学可以百度)
那么我们在建立一个连接的时候需要经历3个步骤(三次握手):
(1)Seq序号(sequence number):占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。 ACK:确认序号有效。 PSH:接收方应该尽快将这个报文交给应用层。 RST:重置连接。 SYN:发起一个新连接。 FIN:释放一个连接。
需要注意的是:
不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对。
建立一个TCP连接时,需要客户端和服务器端总共发送3个包。 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。在socket编程中,客户端执行connect()时将触发三次握手。
第一次握手(SYN=1,seq=x): 客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1): 服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1。服务器端选择自己的ISN序列号,放在seq域里,同时将确认序号(Acknowledgement Number)设置为客户的ISN加1,即X+1。发送完毕后,服务器端进入SYN_RCVD状态。
第三次握手(ACK=1,seq = x+1 ,ACKnum=y+1): 客户端再次发送确认包(ACK=1),SYN标志位为0,并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在数据段放 X 的+1。 发送完毕后,客户端进入ESTABLISHED状态,当服务器端收到这个包时,也进入ESTABLISHED状态,TCP握手结束,TCP连接建立完成。
建立连接之后,我们就要开始向服务端发起请求
HTTP/1.1协议中,客户端和服务端默认对方支持长连接-keepalive,因为 keepalive 在很多情况下能够重用连接,减少资源消耗,缩短响应时间,所以在 HTTP1.1 中缺省就是支持 keepalive 的。
如果响应方不想支持 keepalive,需要在应答报文头中明确的标识 Connection:close,那么客户端设置的 Connection:keep-alive 就失效了,如果客户端不想支持keepalive,需要在请求报头中明确标识Connection:close
设置 HTTP 短连接: 在应答报文头中设置 Connection:close,则在一次请求/响应之后,就会关闭连接。 设置 HTTP 长连接,有过期时间: 在应答报文头中设置 Connection:keep-alive 和 Keep-Alive: timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第 58 秒时,再次使用此连接,则连接仍然有效,使用完之后,重新计数,空闲 60 秒之后过期。 设置 HTTP 长连接,无过期时间: 在应答报文头中只设置 Connection:keep-alive,表明连接永久有效。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF GET /Chris.jpg HTTP/1.1 Method : 请求方法; Request-URI :统一资源标识符; HTTP-Version:请求的HTTP协议版本; CRLF:回车和换行
HTTP请求方法也被叫做“请求动作”,不同的方法规定了不同的操作指定的资源方式。服务端也会根据不同的请求方法做不同的响应。
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由 名字+:+空格+值 组成,消息报头域的名字不区分大小写。
典型的请求头有:
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
User-Agent:内容包含发送请求的用户信息,一般是浏览器类型、操作系统等信息
Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
Accept-Controller-Allow-Origin :本次请求来自哪个源,服务器根据该值判断是否同意请求,在解决跨域问题上也会用到
Cache-Controller:指定请求和响应的缓存机制。只在当前请求生效
Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
Cookie:Cookie分2种,一种是客户端向服务端发送的,使用Cookie报头,用来标记。另一种是服务器发给浏览器的,报头为set-Cookie。
消息报头结束之后,空行 标志着请求头结束,请求正文(请求体)的开始 username=aa&password=1234
响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。具体过程如下所示。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有