RUN__IT # HTTP协议--三次握手四次挥手

HTTP,HyperText Transfer Protocol。超文本传输协议,是互联网上应用最为广泛的一种网络协议。基于TCP的协议,HTTP是一个客户端和服务器端请求和应答的标准。
udp是User Datagram Protocol的简称,是用户数据报协议。无连接的传输层协议。
tcp是Transmission Control Protocol,缩写为 TCP。是传输控制协议。是一种面向连接的。可靠的。基于字节流的传输层通信协议。

TCP的三次握手
在这里插入图片描述

1、第一次握手:(客户端:服务器在吗?)

建立连接时,客户端A发生SYN包(SYN=j)到服务器B

并进入SYN_SEND状态,等待服务器B确认

2、第二次握手:(服务器:收到了,在的,)

服务器B收到SYN包,必须确认客户A的SYN,ACK=j+1

同时自己也发送一个SYN包,SYN=k

即,SYN+ACK包,此时服务器进入SYN_RECV状态

3、第三次握手:(客户端:我要发数据了)

客户端A收到服务器B的SYN+ACK包

向服务器B发送确认包ACK(ACK=k+1)

此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手

TCP的四次挥手
在这里插入图片描述


1、客户端A发送一个FIN.用来关闭客户A到服务器B的数据传送(报文段4)(客户端:我要关了)

2、服务器B收到这个FIN. 它发回一个ACK,确认序号为收到的序号+1(报文段5)。和SYN一样,一个FIN将占用一个序号(服务端:好的,收到)

3、服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)(服务端:我也要关了)

4、客户端A发回ACK报文确认,并将确认序号设置为序号加1(报文段7)(客户端:好的,收到)
服务器如何复用同一个端口而不会提示端口被占用

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

允许地址重用

str.splitlines()按照行('\r', '\n', '\r\n')分隔,返回一个包含各行作为元素的列表

浏览器Brower ---->服务器server发送的请求格式如下: 请求头 request header

https://www.baidu.com/a/b/login.html

127.0.0.1:7890

GET /a/b/login.html HTTP/1.1  # 请求行   GET是请求方式  /index.html是资源路径  HTTP/1.1是协议版本
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

服务器—>浏览器回送的数据格式如下: 响应头 response header

HTTP/1.1 200 OK  # 响应行   HTTP/1.1是协议版本  200表示的是状态码
Bdpagetype: 1
Bdqid: 0xe87cb3f700023783
Bduserid: 0
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Cxy_all: baidu+55617f8533383cbe48d5d2b7dc84b7f0
Date: Fri, 20 Oct 2017 00:59:55 GMT
Expires: Fri, 20 Oct 2017 00:59:11 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1463_21080_17001_20929; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Powered-By: HPHP
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

<h1>haha</h1>  # 响应体 response body

200表示⼀个成功的响应,后⾯的OK是说明。

如果返回的不是200,那么往往有其他的功能,例如,失败的响应有404 Not Found:⽹⻚不存在

500 Internal Server Error:服务器内部出错

…等等…

每个HTTP请求和响应都遵循相同的格式,⼀个HTTP包含Header和Body两部分,其中Body是可选的。
HTTP响应如果包含body,也是通过\r\n\r\n来分隔的。
请再次注意,Body的数据类型由Content-Type头来确定,如果是⽹⻚,Body就是⽂本,如果是图⽚,Body就是图⽚的⼆进制数据。
当存在Content-Encoding时,Body数据是被压缩的,最常⻅的压缩⽅式是gzip,所以,看到Content-Encoding: gzip时,需要将Body数据先解压缩,才能得到真正的数据。压缩的⽬的在于减少Body的⼤⼩,加快⽹络传输。

猜你喜欢

转载自blog.csdn.net/RUN__IT/article/details/89388050