http-1

538 阅读4分钟

HTTP 和 TCP协议

客户端 - 服务端 客服端访问一个路径,路径去DNS域上找对应ip地址 http主要针对应用层:会生成报文,传输内容通过TCP传输,http是基于TCP的,并且能 tcp主要职责:为方便通信,将http请求报文分割成报文段,按序号分为多个报文段,并把每个报文段可靠(UDP是不可靠的)的传给对方

http特点-长连接 keep-alive 发一个请求过去不是立马断开的 客户端同时可以发送N个请求到服务器,服务器等待响应完后再响应给客户端

URI URL URN

uri 统一资源标识符 资源独一的标识信息 url 统一资源定位符 表示资源的地点 urn 统一资源命名符 准确知道名字

URL格式

https://user:pass@ www.example.jp: 80 /dir/index.html? uid=1 #ch1
协议 登录信息 服务器地址 服务器端口号 文件路径 查询字符串 片段标识符(服务器拿不到哈希值) https://3028213607@qq.com:zf1234567@gitee.com/jw-speed/201805.git

// url.parse('path') 取问号后的参数
let url = require('url');
let {pathname,query} =  url.parse('http://user:password@www.zf.cn:80/1.html?a=1&b=c#aaa');
console.log(pathname,query)///1.html,a=1&b=c 
/*
 Url {
 protocol: 'http:',
 slashes: true,
 auth: 'user:password',
 host: 'www.zf.cn:80',
 port: '80',
 hostname: 'www.zf.cn',
 hash: '#aaa',
 search: '?a=1',
 query: 'a=1',
 pathname: '/1.html',
 path: '/1.html?a=1',
 href: 'http://user:password@www.zf.cn:80/1.html?a=1#aaa' }
 */
//取a=1&b=c
let str = 'a=1&b=c';
let obj = {};
str.replace(/([^=&]*)=([^=&]*)/g,function (data) {
    obj[arguments[1]]=arguments[2]
    console.log(obj) //{ a: '1', b: 'c' }
})

// url.parse('path',true) 第二个参数会自动把问号后面参数变成对象  
let url = require('url');
let {pathname,query} =  url.parse('http://user:password@www.zf.cn:80/1.html?a=1&b=c#aaa',true);
//pathname 代表/ 后面的和 ? 前面的  query 是查询字符串
console.log(pathname,query) //     /1.html { a: '1', b: 'c' }

HTTP

  • 请求的一方叫客户端,响应的一方叫服务器端
  • 通过请求和响应达成通信
  • HTTP是一种不保存状态的协议
请求报文 - 是一种规范

请求行:
POST /form/entry HTTP/1.1 请求首(头)部字段: Host: hackr.jp Connection:keep-alive Content-Type:application/x-www-form-urlencoded Content-Length:16 请求行 方法

- GET 获取资源
- POST 向服务器端发送数据,传输实体主体
- PUT 传输文件
- HEAD 获取报文首部
- DELETE 删除文件
- OPTIONS 询问支持的方法 : 一般在跨域时发送post时使用,试探形
- TRACE 追踪路径
- 协议/版本号
- URL

内容实体: name=ueno&age=37

  • 响应行
  • 响应头
  • 响应体

报文首部 状态行 空行(CR+LF) 响应首部字段 报文主体 通用首部字段 实体首部字段 其它

> General:
    Request URL: https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/wche=0&rsv_tpfail=1&rsv_pstg=20&rsv_prw&rsv_svoice=0&rsv_pre=1&.gif..
    Request Method: GET
    Status Code: 200 OK
    Remote Address: 220.181.112.244:443
    Referrer Policy: unsafe-url
            
> Response Headers :响应头
    Accept-Ranges: bytes
    Age: 21234872
    Cache-Control: max-age=315360000
    Content-Encoding: gzip
    Content-Length: 5685
    Content-Type: application/javascript
    Date: Tue, 07 Aug 2018 06:20:59 GMT
    ETag: "3812-5437207ef2880"
    Expires: Thu, 02 Dec 2027 11:46:27 GMT
    Last-Modified: Mon, 12 Dec 2016 08:38:42 GMT
    Ohc-Response-Time: 1 0 0 0 0 0
    Server: bfe/1.0.8.13-sslpool-patch
    Vary: Accept-Encoding,User-Agent
    
> Request Headers :请求头  
    Accept: image/webp,image/apng,image/*,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Cookie:  
    Host: sp0.baidu.com
    Referer:  
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36
    

状态码类别

类别	原因短语
1XX	Informational(信息性状态码)	
2XX	Success(成功状态码)	
    2XX 成功 #
    200-OK 客户端发过来的数据被正常处理
    204-正常响应,没有实体
    206-范围请求,返回部分数据,响应报文中由Content-Range指定实体内容
    
3XX	Redirection(重定向)	
    301-永久重定向
    302-临时重定向,规范要求方法名不变,但是都会改变
    303-和302类似,但必须用GET方法
    304-状态未改变 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
    307-临时重定向,不该改变请求方法
    
4XX	Client Error(客户端错误状态码)	
    400-请求报文语法错误
    401-需要认证
    403-服务器拒绝访问对应的资源
    404-服务器上无法找到资源
5XX	Server Error(服务器错误状态吗)
    500-服务器故障
    503-服务器处于超负载或正在停机维护

http 面试题

1) URI URL URN区别

    - uri 统一资源标识符 资源独一的标识信息
    - url 统一资源定位符 表示资源的地点
    - urn 统一资源命名符 准确知道名字

2) restful 风格 规定了不同方法对资源操作是不同的

   如对/user进行操作 
    - get / user      获取用户
    - post / user     增加用户
    - put / user      修改用户
    - delete / user   删除用户