TCP/IP五层模型——应用层协议(HTTP、HTTPS)

应用层协议负责应用程序之间的数据沟通

应用层自定制协议:自己定义的协议,也叫私有协议

  • 二进制序列化/ json序列化/ protobuf序列化
  • 序列化:将数据对象按照指定协议进行组织成为进行持久化存储/数据传输的数据格式的过程
  • 反序列化:将持久化存储/数据传输的二进制数据按照制定协议进行解析得到数据对象的过程

HTTP协议

HTTP协议也叫做超文本传输协议

使用场景:通过网址请求网络中的某个资源
网址:统一资源定位符(URL–Uniform Resource Locator)

网址的元素

网址的元素包含:协议方案名称://用户名:密码@服务器IP地址:端口/资源路径?查询字符串#片段标识符

  • 协议方案名称: http/https/ftp
  • 服务器IP地址:域名服务是服务器地址解析的一种方式,以更容易记忆的字符串来表示服务器地址,最终还是要被解析得到服务器的IP地址
  • 服务器端口: http默认使用80端口https默认使用443端口
  • /资源路径:请求的资源在服务器上的路径。这个路径是一个相对根目录的路径,为了告诉服务器自己想要什么
  • 查询字符串: 一个个key=val形式的键值对,键值对之间以&间隔,提交给服务器的数据
    • urlencode: url编码val中不能出现特殊字符,因此对特殊字符的每个字节进行编码,就是将每个字节的数据转换成16进制字符;例如:+转换为%2b
    • urldecode:url解码val中遇到%, 则将紧跟其后的两个字符转换位数字;第一个数字*16加上第二个数字
  • 片段标识符:传输的网络资源的一个标签,可以直接定位到网页的某个位置

HTTP协议格式

首行
  • 请求首行:包含三部分信息:请求方法、URL、协议版本(以空格进行间隔,以r\n作为结尾)

    • 协议版本: HTTP/0.9:短连接/1.0:长连接/1.1:管线化/2:服务端主动推送
    • 请求方法: GET/HEAD/POST/PUT/DELETE...
      • GETHEAD区别:是否要服务器响应正文
      • GETPOST区别:
        • Get请求能缓存,Post不能
        • Post提交的数据在正文中,GET请求的数据在urI的查询字符串中,会被浏览器保存历史记录;因此Post的安全性相对好一点点,但是在抓包的情况下都是一样的
        • Post可以通过request body传输数据,Get不行;Get的请求在url中,url有长度限制;因此Post可以传输比Get更长的数据
        • Post支持更多的编码类型,且对数据类型不做限制
      • GET/HEAD/POST都用于请求资源。POST更常用于提交表单数据;GET和HEAD更倾向与请求某个资源
  • 响应首行:包含三部分信息:协议版本、响应状态码、状态码描述(以空格进行间隔,以r\n作为结尾)

    • 状态码描述:每个状态码都有官方的描述,这个描述也可以自定义

    • 响应状态码: 1xx:描述性信息2xx:正确处理的反馈3××:重定向请求位置4xx:客户端错误5xx:服务端错误

    • 常见响应状态码:

      状态码含义
      200 OK客户端的请求在服务端被正确处理
      204 No Content请求成功,但响应报文不含实体的主体部分
      205 Request Content请求成功,但响应报文不含实体的主体部分,要求请求方重置内容
      206 Partial Content进行范围请求
      301 Moved Permanently永久重定向,表示被请求的资源已经被分配了新的URL
      302 Found(Move Temporarily)临时重定向,表示被请求的资源临时被分配了新的URL
      304 Not Modified表示服务器允许访问资源,但应发生请求为满足条件的情况
      307 Temporary Redirect临时重定向,和302含义类似,但期望客户端保持请求方法不变,向新的地址发出请求
      400 Bad Request请求报文存在语法错误
      401 Unauthorized表示发送的请求需要有通过HTTP认证的认证信息
      403 Forbidden对请求资源的访问被服务器拒绝
      404 Not FoundURL无效或者URL有效但是没有资源
      500 Internal Server Error服务器内部错误,无法完成请求
      501 Not Implemented表示服务器不支持当前请求所需要的某个功能
      503 Service Unavailable表示服务器暂时处于超负荷或正在停机维护,无法处理请求
头部

HTTP协议头部是一个个的key: val形式的键值对,键值对之间以\r\n作为间隔(每个键值对以\r\n作为结尾)。遇到连续两个\r\n即为头部结束的标志,第二个\r\n就是分隔头部和正文的空行

  • Host:服务器的域名
  • User-Agent:客户端信息
  • Connection:描述当前连接是否是长连接close/keep-alive
  • Content-Length:描述当前正文有多长; (通过这个描述信息可以告诉对端本次请求应该接收多长的数据)
  • Content-Type:描述了正文的类型。告诉对方应该如何处理正文(test/html)
  • Accept**:告诉对端自己能够正确接某种类型的数据
  • Referer:告诉服务器,本次请求是从哪个网页点击请求跳转过来的
  • Transfer-Encoding: 传输编码方式。chunked:正文的分块传输,将正文分为多块传输,每块在发送前先告诉对方这块数据有多长;0\r\n\r\n表示分块结束,常用于服务端本身不确定自己要响应的数据有多长的时候
  • Location: http://123.207.58.25/搭配3xx状态码使用;通过描述的地址信息告诉客户端重新去请求指定的这个地址
  • Cookie/Set-Cookie: http协议是一个无状态协议,服务端为每一个登陆的客户端在服务端主机上创建一个session (会话) ;会话中描述了客户端的各种信息;将session保存在数据库中,然后通过Set-Cookie将sessionid以及重要的信息返回给客户端;客户端会将其中的信息保存在cookie文件中;下一次请求服务端的时候,会自动从cookie文件中读取出信息,通过Cookie传递给服务端

Cookie与session有什么区别:

  • Session是服务端为每一个客户端单独创建的会话,保存在服务端,会保留有客户端的认证信息…
  • Cookie是服务端通过Set-Cookie响应给客户端的信息,保存在客户端,下次请求服务器的时候会携带有Cookie信息
空行

概念:空行是分隔头部和正文,很多文档中没有空行这个概念

  • 头部中最后一个头部信息也是以\r\n作为结尾的;空行的重要性在于判断是否接收了完整的http头部信息
  • 例如:first_line\r\nkey: val\r\nkey:val\r\n....key:val\r\n\r\ncontent

接收http数据的流程:

  1. 接收完整的http头部—接收数据知道遇到\rn\r\n的时候,认为头部到此结束;
  2. 解析头部,根据头部中的Content-Length决定,正文应该接收多长;接收相应长度的正文
正文

概念:客户端提交给服务端的数据/服务端响应给客户端的数据

HTTPS协议

概念:HTTPS协议是加密后的HTTP协议。http默认使用80端口https默认使用443端口

https是如何进行加密传输的:通过ssl加密实现(非对称加密算法/对称加密算法+签名证书)

为什么对传输过程进行加密:数据直接在网络中传输,很容易被劫持修改,有很大的安全隐患

对称加密算法:如何加密就如何解密,两边拥有相同的密钥,加密算法和解密算法是一样的

  • 对称加密算法优点:加密解密效率比较高
  • 对称加密算法缺点:容易被破解,使用时间稍长就会被中间劫持,根据数据规律破解出加密算法
  • 解决破解方案:最好能够每次通信都动态协商一个新的对称加密算法,仍有可能被劫持

非对称加密算法:加密和解密的方法不同,服务端生成一个公钥和私钥, 将公钥传递给客户端,客户端使用公钥进行加密,服务端使用私钥解密

  • 公钥和私钥:通过加密算法(例如RSA算法)得到的一对密钥(就是两串数据) , 公钥用于对数据加密,私钥用于对加密后的数据进行解密,因为加密方式和解密方式不同,因此很难被破解;就算中间公钥被人劫持, 客户端使用公钥加密后的数据只能用私钥进行解密
  • 非对称加密算法的优点:安全性高,不容易被破解
  • 非对称加密算法的缺点: 解密效率比较低

非对称加密和对称加密结合:将客户端与服务端进行动态协商对称加密算法过程使用非对称加密保护起来;然后使用协商后的对称加密算法,对数据通信过程进行加密;这样就既保证了安全,也保证了效率

  • 若中间黑客劫持了公钥数据,将自己的公钥发送给客户端,此时公钥的传输也存在安全隐患:无法确定对方的身份

如何确定发送公钥的这个服务端是指定的那个服务端?若能解决这个问题,确定这个发送公钥的服务端就是指定服务端,就不怕被劫持了

  • 签名证书(CA) :进行身份验证,并且传输公钥信息,公司生成了一对密钥之后,拿着密钥去权威机构掏钱颁发生成一个签名证书,证书中包含:公钥信息,权威机构信息,当前公司机构的信息,有效时间…

ssl加密过程

  • tcp在通信的时候,连接建立成功之后
  • 服务端就会先将证书发送给客户端,客户端根据证书中的机构信息,进行身份验证
  • 若身份验证不通过,则可以直接断开连接(当然也可以设置是否信任这个机构)
  • 若身份验证通过,就使用证书中的公钥加密对称加密算法的协商过程,最终使用协商成功的对称加密算法对通信进行加密

输入网址按下回车后发生了什么

  • 首先,先在本地缓存中查询有没有访问过,若没有就进行DNS域名解析,查询到具体的IP地址
  • 然后,应用层下发数据给传输层,传输层封装TCP报文,下发给网络层
  • 网络层中的IP协议会确定IP地址,根据IP地址指示如何跳转路由器,再被封装到数据链路层的数据帧结构中,进行物理层传输
  • 服务端对传输过来的数据进行层层解析,再把客户端请求的数据打包发送给客户端
  • 浏览器对html数据进行渲染,把网页显示给用户

编写一个简单的http服务器

ttp协议是应用层协议,在传输层使用的是tcp协议

  1. 搭建tcp服务器
  2. 等待连接到来,接收http数据(应用层数据)
    1. 接收http头部数据
    2. 解析头部(请求方法+ur| (资源路径+查询字符串) + 协议版本+各个头部键值对)
    3. 根据头部中的Content-Length接收正文
  3. 针对客户端的请求进行业务功能处理,处理完毕之后组织http响应数据,发送给客户端
    1. 业务处理(跟具体的业务相关,不讨论)
    2. 根据http响应格式组织响应数据(首行(协议版本+状态码+描述) + 头部+正文)
    3. 响应给客户端
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值