HTTP

参考:
HTTP协议详解
HTTP协议处理流程

HTTP练习沙箱:httpbin.org

官方文档:
IETF RFC2616 HTTP/1.1
https://www.w3.org/Protocols/
http://www.faqs.org/rfcs/

书籍参考:
《HTTP权威指南》

基本知识点

超文本输出协议
快速,灵活
请求方法:GET、HEAD、POST、PUT、DELETE
传输类型以 Content-Type加以标记
无连接:请求完收到响应即断开连接
无状态:后续处理需要前面的信息就必须重传

HTTP request:请求行,请求头,请求体;
HTTP response:状态行,响应头,响应体;

  • http状态码 :
    302 是请求重定向,304未改变,用于浏览器缓存机制;
    500以上是服务器错误
    400以上是请求链接错误或者找不到服务器,401未授权,404未找到;
    200以上是正确
    100以上是请求接受成功

  • cookie RFC6265
    为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据,通常经过加密,可以叫做浏览器缓存;
    cookie是由web服务器创建的保存在用户浏览器上的小文本文件,它包含有关用户信息,可以加快用户访问速度,但是会导致安全问题;
    用户访问一个web服务器时,浏览器首先要检查本地的cookies,并将其样发给web服务器;
    cookies最经典的应用是判定注册用户是否已经登录网站;

  • HTTP URL请求过程
    请求DNS域名解析
    TCP/IP连接
    发送请求
    接受响应
    客户端主动关闭

  • chunked 编码
    一般情况下HTTP的header包含content-length来指明报文体长度;
    但有时候服务生成HTTP回应是无法确定消息大小的,比如大文件的下载,或者后台需要复杂的逻辑才能全部处理页面的请求,这时需要实时生成消息长度,服务器一般使用 chunked 编码;
    编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容

HTTP 原理
参数字段
  • Keep-Alive:
    Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接,有一个设置时间
  • Range:
    设置断点下载/续传的位置
Socket

socket起源于Unix,而Unix/Linux的基本哲学之一就是“一切皆文件”;
scoket是一套完成TCP/UDP协议的接口,本身并不是协议,而是一个调用接口;

  • 心跳
    理论上socket的TCP链接是长连接,一般不会主动断开,但是会出现异常情况导致连接断开,所以在无数据传输的时候要发送心跳消息,消息内容由开发者自定义;

HTTPS

HHTPS 使用 443端口, HTTP使用80端口;
HTTP+SSL,SSL(安全套接层)是Netscape公司设计的主要用于web的安全传输协议,通过证书来确保客户端跟服务端之间的通信数据是加密安全的;
加解密算法类型:

  • 对称加密:密钥只有一个,加密解密为同一个密码,切加解速度快
    典型的对称加密算法有DES、AES、RC5、3DES等;
  • 非对称加密:使用两个密钥,公共密钥和私有密钥
    根据公钥无法推知私钥,根据私钥也无法推知公钥,相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等;
    私有由一方保存,另一方任何人都可以获得公共密钥;
    URL导图:


    HTTP_第1张图片
    Paste_Image.png
HTTP_第2张图片
Paste_Image.png

Multipart/form-data

https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
https://my.oschina.net/cnlw/blog/168466
http://www.faqs.org/rfcs/
http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式;
multipart请求头信息: Content-Type,其值必须规定为multipart/form-data,具体的头信息如下:

Content-Type: multipart/form-data; boundary=${bound}

${bound}是一个占位符,代表我们规定的分隔符;
与post请求体不同的是它的构造方式,post是简单的name=value值链接,而multipart/form-data则是添加了分割符等内容的构造体;
**要发送一个multipart请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可

HTTP_第3张图片
Paste_Image.png

你可能感兴趣的:(HTTP)