【网络】Http协议必读

HTTP简介:
HTTP:超文本传输-协议,基于TCP/IP通信协议来传输数据。
http工作原理:客户端-服务端架构,客户端通过URL向http服务端发送请求,服务端接收到请求后,向客户端发送响应信息。http默认端口号80。

http三个特点
http是无连接的,限制每次连接只处理一个请求,服务器处理完客户端请求,并受到客户端的应答后,断开连接,节省传输时间;
http是媒体独立的,客户端和服务器能处理的数据,都可以通过http发送;
http是无状态的,对于处理过的事务没有记忆能力,比如无法记忆用户是否登录,Cookie就是来解决这个问题的。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HTTP消息结构:
客户端请求消息:请求行,请求头,空行和请求数据
    请求行:GET /test.html HTTP/1.1
    常用消息头:
    Accept:text/html,image/*(告诉服务器。浏览器可以接收文本,网页图片)
    Accept-Charaset:ISO-8859-1(接收字符编码:iso-8859-1)
    Accept-Encoding:gzip,compress(可以接收gzip和compress压缩后的数据)
    Accept-Language:zh-cn(浏览器支持的语言)
    Host:localhost:8080(浏览器要找的主机)
    IF-MODIFIED-Since:Tue,11Jul 2018 20:30:30(告诉服务器,我的缓存中有这个文件,该文件的事件是...)
    Referer:http://localhost:8080/test.html(告诉服务器我来自哪里,常用于防止下载,盗链)
    User-Agent:Nozilla/4.0(Com...)(告诉服务器浏览器内核)
    Cookie:
    Connection:close/Keep-Alive(保持链接,发完数据后,我不关闭链接)
以下理论,用网络抓包分析工具实践(WireShark)
服务器响应消息:状态行,消息报头,空行,响应正文
    状态行:HTTP1.1 200 OK 协议版本、状态码、简要描述    
    http响应头信息:
    location:http://...
    server:apache tomcat(告诉浏览器我是tomcat)
    Content-Encoding:gzip(告诉浏览器我使用了gzip)
    Content-Lenght:80(告诉浏览器送回数据字节大小)
    Content-Language:zh-cn(支持中文)
    Content-Type:text/html;charaset=gb2312(内容格式和编码)
    Last-Modified:Tue 11Jul 2018 20:30:30(告诉浏览器上次更新时间)
    Refresh:1;url=http://www.baidu.com(过1秒刷新到百度)
    Content-Disposition;attachment;filename=aaa.zip(告诉浏览器 有文件下载)
    Expries:-1(不缓存页面)
    ......等等
    
    空行:区分请求数据和请求行、头信息
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------


HTTP状态码分类:
    1**:消息服务器已收到,需要请求者继续操作(101:客户端需要切换协议)
    2**:成功(200)
    3**:重定向,需要进一步操作完成请求(302:网页被永久转移到其他URL)
    4**:客户端错误(404:找不到页面)
    5**:服务器错误(500:内部服务器错误)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HTTP请求方法:
http1.0有三个方法:GET,POST,HEAD
http1.1新增了5个方法:OPTIONS,PUT,DDELETE,TRACE,CONNECT
GET:请求指定的页面信息,并返回实体主体
POST:向指定的资源提交数据进行处理请求(表单、文件),数据被包含在请求体内,可能会导致新的资源的建立和已有资源的修改
HEAD:类似GET请求,只不过返回响应中,没有具体内容,用于获取报头
OPTIONS:允许客户端查看服务器的性能
PUT:从客户端向服务器传送的数据取代指定的文档的内容
DELETE:请求服务器删除指定的页面
TRACE:回显服务器收到的请求,用于测试或诊断
CONNECT:预留给能够将连接改为管道方式的代理服务器
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------


GET和POST区别:
get:请求指定的页面信息,也就是直接写url去访问,暴露url;
     会被缓存,不安全;
     把请求头信息和数据信息,一次性发送(发一次包);
     对长度有限制(2K,但是我试过并没有限制);
post:向指定资源提交数据进行处理请求,数据包在请求体内;
     参数不会被保留;
     先发送header,服务器响应100,再发送data(发两次包);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SYN:Synchronized Sequence 同步位(位码=1,代表同步位状态成功)
序列号:Sequence Number(随机产生)
ACK:Acknwolegement 确认位(主机产生的序列号+1)
SYN_SENT:客户端已经发送完SYN数据包
SYN_RCVD:服务端已经收到SYN数据包
ESTABLISHED:已经建立了连接,可以发送数据了    

关于位码:位码即tcp标志位,有6种:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

TCP三次握手:
C端:客户端;S端:服务端
第一次握手:C端向S端发送SYN数据包(SYN=1,序列号=x)。A进入SYN_SENT状态,等待服务端确认。
第二次握手:S端收到SYN数据包并进行确认(SYN=1,ACK number=x+1,ACK=1,序列号=y),再发送SYN+ACK数据包给C端,S端进入SYN_RCVD状态。
第三次握手:C端收到SYN+ACK数据包,如果ACK number=x+1,将ACK number设置为y+1,ACK=1,向S端发送ACK数据包,C端和S端都进入ESTABLISHED(已连接)状态。
简述:我连你,你同意,我再连你(成功)。

如图:【网络】Http协议必读_第1张图片

为什么要三次握手?
为了防止已失效的连接请求报文段突然又传到了服务端,产生错误。
解释:报文段已发送,在某个网络节点发生滞留,导致连接释放,释放后报文才到达另一端。
例如:C端发送SYN报文给S端,连接被释放后,S端才收到报文并误认为这是C端的新连接,给C端发送SYN+ACK报文,这是无法得到C端回应的,因为连接已无效。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCP四次挥手:
A、B:客户端或者服务端
FIN:结束
FIN_WAIT_1:A发起主动关闭连接时,的状态(很难看到,因为发起关闭连接后,另一端会马上同意)
FIN_WAIT_2:B端同意关闭,但是还有一些数据要给A,A不能马上关闭的,半连接状态
TIME_WAIT:A等2MSL后,就可以关闭了。(如果FIN_WAIT_1时,就收到了FIN和ACK数据包,直接进入此状态)
为什么要等2MSL,因为无法保证最后一次ACK数据包,是否被对方收到,为了确保可靠性。
2MSL:报文最大生存时间
CLOSED:2MSL后,进入关闭状态。

第一次挥手:A给B发送FIN报文(序列号=x),A进入FIN_WAIT_1状态,表示A没有数据给B了。
第二次挥手:B收到FIN报文后,给A发送ACK报文(ACK=x+1),A进入FIN_WAIT_2状态,B同意A关闭请求。
第三次挥手:B向A发送FIN报文(序列号=y),请求关闭连接,B进入LAST_ACK状态。
第四次挥手:A收到FIN报文,向B发送ACK报文(ACK=y+1),A进入TIME_WAIT状态,B收到ACK报文后关闭连接,A在2MSL后依然没收到回复,证明B端已关闭,A就可以关闭连接了。
简述:我要关闭,你同意,你要关闭,我同意你先关闭我再关闭。

为什么TCP要四次挥手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。
TCP是全双工模式,主机1请求关闭连接,不再发送数据了,但是可以接收主机2的数据,主机2不再发送数据了,才算关闭,这样减小了丢失数据的风险。


 

你可能感兴趣的:(网络)