• HTTP/HTTPS/TCP/IP协议


    一、从一个HTTP请求看网络分层原理

    在网络传输中会遇到各种各样的问题

    1. 数据会丢包
    2. 重新发送会造成数据重复

    为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。

    OSI(Open System Interconnection Reference Model)
    TCP/IP

    一个HTTP请求的分层解析流程
    输入域名->浏览器检索是否有DNS缓存/hosts文件是否配置->都无则发起DNS请求->DNS使用UDP进行传输->网络层使用ARP协议

    二、HTTP协议

    超文本传输协议(HyperText Transfer Protocol)
    一种无状态的,以请求/应答方式运行的协议,它使用可拓展的语义和自描述消息格式,与基于网络的超文本信息系统(HTML)灵活的互动

    1、HTTP报文格式

    • 起始行(start line):描述请求或者响应的基本信息
    • 头部字段集合(header):使用key-value形式更详细地说明报文
    • 消息正文(entity):市级传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据

    2、请求行报文格式

    • 请求方法:GET/HEAD/PUT/POST,表示对资源的操作;
    • 请求目标:通常是一个URI,标记了请求方法要操作的资源
    • 版本号:表示报文使用的HTTP协议版本

    3、响应行报文格式

    • 版本号:表示报文使用的HTTP协议版本;
    • 状态码:一个三位数、用代码的形式表示处理的结果
    • 原因:作为数字状态码补充,是更详细的解释说明

    4、HTTP头字段

    头部字段是key-value形式,key和value之间用":"分隔,最后用CRLF换行表示字段结束。比如"Content-type:application/json",HTTP头字段非常灵活,不仅可以用常用的key(User-Agent浏览器名称, Referer来源,Cookie,Content-type数据格式,accept可接受的文件类型,accept-encoding可接受的数据编码,accept-language当前使用的浏览语言),也可以自定义key

    头字段注意事项

    • 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符"-"但不能使用下划线"_"。字段名后面必须紧接着":"不能有空格,而":"后的字段值可以有多个空格
    • 字段的顺序是没有意义的,可以任意排序
    • 字段原则上不能重复,除非这个字段本身语义允许,如Set-Cookie

    5、常用头字段

    HTTP协议里有非常多的头字段,分四类

    • 请求字段: Host,Referer
    • 相应字段:Server,Date
    • 通用字段:在请求头和响应头里都可以出现 Content-type,Connection

    三、HTTP请求的完整过程

    当用户在浏览器输入网址回车之后,网络协议都做了哪些工作

    1. 浏览器解析URL中的域名
    2. 根据域名获取对应的ip地址,首先从浏览器缓存中查看
      chrome://net-internals/#events
      如果没有则从本机域名解析文件hosts,如果还没有则发起DNS请求
    3. 拿到IP地址后,浏览器与服务器进行三次握手
    4. 握手建立之后,开始发送HTTP请求报文
    5. 服务器收到浏览器报文之后开始请求报文解析,生成响应数据,发送相应数据
    6. 浏览器收到响应之后,开始渲染页面

    四、TCP协议

    TCP(Transmission Control Protocol)
    面向连接的,可靠的,基于字节流的传输层通信协议

    特点:

    • 基于连接的:数据传输之前需要建立连接
    • 全双工的:双向传输
    • 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
    • 流量缓冲:解决双方处理能力的不匹配
    • 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
    • 拥塞控制:防止网络出现恶行拥塞

    TCP连接管理

    1、TCP连接:四元组【源地址、源端口、目的地址、目的端口】
    2、确立连接:三次握手
    a. 同步通信双方初始序列号(ISN initial sequence number)
    b. 协商TCP通信参数(MSS,窗口信息,指定校验和算法)

    如何进行握手
    1、服务端监听一个端口(一般是80),进入Listening状态
    2、客户端发送SYN(随机生成x)进入SYN-SENT状态
    3、服务端收到SYN(x),发送SYN(y)和ACK(x+1)(通过SYN里的seq确认是哪一条SYN)进入SYN-RECEIVED状态
    4、客户端收到ACK(x+1),发送ACK(y+1),进入ESTABLISHED状态
    5、握手建立成功,进入ESTABLISHED状态

    3、关闭连接:四次挥手(双方都可以主动关闭连接)
    操作过程
    1、客户端发送FIN(i),客户端进入FIN_WAIT_1的状态
    2、服务端发送ACK(i+1),进入CLOSE_WAIT状态
    3、服务端进行收尾工作,调用close指令,进入LAST_ACK状态,发送FIN(j)
    4、客户端发送ACK(j+1),进入TIME_WAIT状态,等待2MSL(最大报文生存时间)(原因:防止ACK(j+1)丢失,如果客户端直接关闭,客户端无法响应服务端;同时在传输中的数据无法及时到达)
    5、服务端释放连接

    字节流协议

    数据可靠性传输

    停止等待协议

    重传机制
    1、ack报文丢失

    2、请求报文丢失

    这两种方法效率低下

    滑动窗口协议与累计确认(延时ack)
    滑动窗口大小同通过tcp三次握手对端协商,且受网络状态影响
    滑动窗口协议属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生

    特点
    1、通信双方以全双工方式进行通信
    2、控制复杂
    3、传输效率高,尤其对信道质量好,差错率低的情况

    HTTPS协议

    所有的HTTP请求和响应在发送到网络之前,都要进行加密

    SSL/TLS
    安全套接协议(Secure Sockets Layer)

    摘要算法
    把任意数据输出成一个定长的串
    md5, sha1, sha2, sha1 256

    对称加密算法 xor

    加密过程:
    原文:100100111000
    密钥:111100001111 (xor)
    密文:011000110111
    解密过程:
    密文:011000110111
    密钥:111100001111 (xor)
    原文:100100111000

    AES,

    非对称加密
    公钥公开,密钥严格保密
    使用公钥加密,使用私钥解密
    使用私钥加密,使用公钥解密

    DNS劫持

    身份验证
    数字证书
    公钥数字证书(保证公钥的安全)CA机构

    如何申请
    1、生成自己的公钥和私钥,服务器保留自己的私钥
    2、向CA机构提交公钥,公司,域名等等待认证
    3、CA验证,颁发证书,包括:公钥,组织信息,CA信息,有效时间,证书序列号,同时生成一个签名(hash);CA再使用私钥对信息摘要进行加密,密文就是证书的数字签名

  • 相关阅读:
    项目中遇到的IE8浏览器访问页面过慢问题
    linux下安装Oracle时交换空间不足的解决方法
    linux下为目录和文件设置权限
    启动TDS LDAP 服务器遇到的问题总结
    sql1032n sql6048n db2start启动不了 db2修改hostname
    IBM CE 错误集之(FNRCS0005E)
    Oracle同一个用户下启动多个数据库实例
    几种任务调度的 Java 实现方法与比较
    EXP-00056: ORACLE error 12154 encountered
    oracle删除数据库中的所有表
  • 原文地址:https://www.cnblogs.com/zhiless/p/16369453.html
Copyright © 2020-2023  润新知