zoukankan      html  css  js  c++  java
  • HTTP

     

    应用层:为应用软件提供服务,构建与TCP协议之上,屏蔽网络传输相关细节

    传输层:向用户提供端到端的服务,向高层屏蔽了下层数据通信的细节

    网络层 :为数据在结点之间传输创建逻辑链路

    数据链路层:在通信的实体之间建立数据逻辑链路

    物理层:定义物理设备如何传输数据

    http:三次握手

    1.客户端向服务端发送创建连接的请求,里面带有标志位,SYN=1(第一个标志位),Seq=X(数字)

    2.服务端接受到客户端请求,开启tcp socket 端口,返回 SYN = 1,  ACK = X+1  Seq的数字加1,Seq = Y (服务端的Seq)

    3.客户端已被允许创建TCP连接,向服务端发送ACK=Y+1 ,Seq = Z 

    URI:统一资源标志符

    用来唯一标识互联网上的信息资源

    URL:统一资源定位符

    URN:永久统一资源定位符

    简易web服务器实现

    1 const http = require('http')
    2 
    3 http.createServer(function(req,res){
    4     console.log('req',req.url)
    5 
    6     res.end('123')
    7 }).listen(8888)

    localhost:8888      123

    跨域解决

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        
    </body>
    <script>
        var xhr = new XMLHttpRequest()
        xhr.open('GET','http://127.0.0.1:8887/')
        xhr.send()
    
    </script>
    </html>

    server.js

     1 const http = require('http')
     2 const fs = require('fs')
     3 
     4 http.createServer(function(req,res){
     5     console.log('req',req.url)
     6 
     7     const html = fs.readFileSync('index.html','utf-8')
     8     res.writeHead(200,{
     9         'Content-Type':'text/html'
    10     })
    11     
    12     res.end(html)
    13 }).listen(8888)

    server2.js

    const http = require('http')
    
    http.createServer(function(req,res){
        console.log('req',req.url)
    
        res.writeHead(200,{
            'Access-Control-Allow-Origin':'*'
        }) //请求和发送正常进行,被浏览器忽略掉了
    
    
        res.end('123')
    }).listen(8887)

    CORS限制

    允许方法 GET HEAD POST

    允许Content-Type

      text/plain

      multipart/form-data

      application/x-www-form-urlencoded

    请求头限制

      'Access-Control-Allow-Header':' '

    XMLHttpRequestUpload对象均没有注册任何事件监听器

    请求中没有使用ReadableStream对象

    Cache-Control

    可缓存性

    public 

    private 

    no-cache

    到期

    max-age=<seconds>

    s-maxage=<seconds>

    max-stale=<seconds>

    重新验证

    must-revalidate

    proxy-revalidate

    Cookie

    通过Set-Cookie设置

    下次请求会自动带上

    键值对,可以设置多个

    max-age和expires设置过期时间

    Secure只在https的时候发送

    HttpOnly无法通过document,cookie访问

    test.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7     <title>Document</title>
     8 </head>
     9 <body>
    10     
    11 </body>
    12 <script>
    13     console.log(document.cookie)
    14 </script>
    15 </html>

    server.js

     1 const http = require('http')
     2 const fs = require('fs')
     3 
     4 http.createServer(function(req,res){
     5     console.log('req',req.url)
     6 
     7     if(req.url === '/'){
     8         const html = fs.readFileSync('test.html','utf-8')
     9         res.writeHead(200,{
    10             'Content-Type':'text/html',
    11             'Set-Cookie':'123'
    12         })
    13         
    14         res.end(html)
    15     }
    16 
    17 
    18 
    19 }).listen(8888)

    Http长连接

    数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据

     test.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7     <title>Document</title>
     8 </head>
     9 <body>
    10     <img src="/test.jpg" alt=""></img>
    11     <img src="/test.jpg" alt=""></img>
    12     <img src="/test.jpg" alt=""></img>
    13     <img src="/test.jpg" alt=""></img>
    14 </body>
    15 <script>
    16 </script>
    17 </html>

    server.js

    const http = require('http')
    const fs = require('fs')
    
    http.createServer(function(req,res){
        console.log('req', req.url)
    
        const html = fs.readFileSync('test.html','utf-8')
        const img = fs.readFileSync('test.jpg')
    
        if(req.url === '/'){
            res.writeHead(200,{
                'Content-Type':'text/html'
            })
            
            res.end(html)
        }else{
            res.writeHead(200,{
                'Content-Type':'image/jpg'
            })
            res.end(img)
        }
    
    }).listen(8888)

     

    数据协商

    分类

    请求,返回

    Accept: 

      Accept-Encoding

      Accept-Language

      User-Agent

    Content-Type

      Content-Type

      Content-Encoding

      Content-Language

    redirect

     1 const http = require('http')
     2 const fs = require('fs')
     3 
     4 http.createServer(function(req,res){
     5     console.log('req',req.url)
     6 
     7     if(req.url === '/'){
     8     
     9         res.writeHead(302,{
    10             'Location':'/new'
    11         })
    12         
    13         res.end('')
    14     }
    15 
    16     if(req.url === '/new'){
    17         res.writeHead(200,{
    18             'Content-Type':'<div>this is content</div>'
    19         })
    20         
    21         res.end('<div>content</div>')
    22     }
    23 
    24 }).listen(8888)

    Content-Security-Policy

    CSP   内容安全策略

    作用:限制资源获取

    报告资源获取越权

    限制方式:

    default-src 限制全局

    制定资源类型

    test.html

     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <title></title>
     6     </head>
     7     <body>
     8         <div> This is content </div>
     9         <script>
    10             console.log('inline js')
    11         </script>
    12     </body>
    13 </html>

    server.js

    const http = require('http')
    const fs = require('fs')
    
    http.createServer(function(req,res){
        console.log('req',req.url)
    
        if(req.url === '/'){
            const html = fs.readFileSync('test.html','utf-8')
            res.writeHead(200,{
                'Content-Type':'text/html',
                'Content-Security-Policy':'default-src http: https:'
            })
            
            res.end(html)
        }
    
    
    
    }).listen(8888)

    Refused to execute inline script because it violates the following Content Security Policy 

    代理缓存

    通过重用已获取的资源,可大幅提高web站点和应用的性能。由于web缓存减少了延迟和网络流量,因此缩短了展示一个资源所需的时间。通过使用HTTP缓存机制

    test.html

     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="utf-8">
     5         <title></title>
     6     </head>
     7     <body>
     8         <div> This is content:<span id="data"></span> </div>
     9         <script>
    10             fetch('/data').then(function(res){
    11                 return res.text()
    12             }).then(function(text){
    13                 document.getElementById('data').innerText = text
    14             })
    15         </script>
    16     </body>
    17 </html>

    server.js

     1 const http = require('http')
     2 const fs = require('fs')
     3 
     4 const wait = (seconds) =>{   //2s后
     5     return new Promise((resolve,reject) =>{
     6         setTimeout(() =>{
     7             resolve()
     8         },seconds*1000)
     9     })
    10 }
    11 
    12 http.createServer(function(req,res){
    13     console.log('req',req.url)
    14 
    15     if(req.url === '/'){
    16         const html = fs.readFileSync('test.html','utf-8')
    17         res.writeHead(200,{
    18             'Content-Type':'text/html',
    19         })
    20         
    21         res.end(html)
    22     }
    23     
    24     if(req.url === '/data'){
    25         res.writeHead(200,{
    26         'Cache-Control':'max-age=20'
    27         })
    28         wait(2).then(()=>res.end('success'))
    29     
    30     }
    31  
    32 
    33 
    34 }).listen(8888)

    Https

    公钥

    私钥

     

    Http2

    信道复用

    分帧传输

    Server Push

  • 相关阅读:
    Shell脚本最佳实践
    tmux会话断电保存自动恢复
    [JD15] 括号匹配方案
    [LeetCode 187.] 重复的DNA序列
    [LeetCode 162.] 寻找峰值
    基于 Chocolatey 打造 Windows 开发环境
    [LeetCode 71.] 简化路径 【IO】
    【栈】栈排序
    [LeetCode 829.] 连续整数求和
    [LeetCode 29.] 两数相除
  • 原文地址:https://www.cnblogs.com/quyangyang/p/11273192.html
Copyright © 2011-2022 走看看