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 Number同步序列编号(位码=1)

序列号:Sequence Number(随机产生)

ACK:Acknwolegement Number确认序列号(主机产生的序列号+1)

SYN_SENT:客户端已经发送完SYN数据包

SYN_RCVD:服务端已经收到SYN数据包

ESTABLISHED:已经建立了连接,可以发送数据了    


TCP三次握手:

C端:客户端;S端:服务端

第一次握手:C端向S端发送SYN数据包(SYN=1,序列号=x)。A进入SYN_SENT状态,等待服务端确认。

第二次握手:S端收到SYN数据包并进行确认(SYN=1,ACK=x+1,序列号=y),再发送SYN+ACK数据包给C端,S端进入SYN_RCVD状态。

第三次握手:C端收到SYN+ACK数据包,如果ACK=x+1,将ACK设置为y+1,向S端发送ACK数据包,C端和S端都进入ESTABLISHED(已连接)状态。

简述:我连你,你同意,我再连你(成功)。


为什么要三次握手?

为了防止已失效的连接请求报文段突然又传到了服务端,产生错误。

解释:报文段已发送,在某个网络节点发生滞留,导致连接释放,释放后报文才到达另一端。

例如: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不再发送数据了,才算关闭,这样减小了丢失数据的风险。