协议设计与HTTP协议

痛定思痛。 2022-03-09 19:07 480阅读 0赞

在这里插入图片描述

文章目录

      • 记住,TCP是一种流协议
      • 常见的协议格式
          • 便于解包的协议设计方法
  • 详解 Http 协议(不考虑http版本)
    • HTTP请求格式
            • 请求方法:
            • 请求头都有些什么?
    • HTTP响应格式
          • Content-Type: text/plain
          • Content-Length 字段
          • Content-Encoding 字段
          • set-Cookie 字段
    • http状态码
    • http/1.0,http/1.1,http/2.0 的区别以及 HTTP 与 HTTPS 有什么区别?
          • 见 :[从 Http 聊到 Https](https://blog.csdn.net/liushengxi\_root/article/details/100188396)
    • 输入一个url到浏览器页面展示都经历了哪些过程

以下摘自欢神的博客:

记住,TCP是一种流协议

语出《Effective TCP/IP Programming》。意思是,TCP的数据是以字节流的方式由发送者传递给接收者,没有固有的“报文”或者“报文边界”的概念。简单说,TCP不理解应用层通信的协议,不知道应用层协议格式和边界。所以,所谓的“粘包和断包”是个伪概念。TCP压根就没有包边界的概念,何谈粘与断。

OSI模型定义的7层结构网络中,TCP协议所在的传输层和应用层之间还有会话层和表示层,原本协议包分界和加密等等操作是在这两层完成的。TCP/IP协议在设计的时候,并没有会话层和表示层。那如果用户需要这两层提供的服务怎么办?比如包的分界?答案是,用户自行在应用层代码中实现吧。

常见的协议格式

这个很简单,和文件一样,无非是纯文本格式或者二进制格式

便于解包的协议设计方法

一般而言,应用层协议设计有四种常见方法:

  • 1.每个发送的包长度固定 (这不就是暑假写聊天室时用的吗?直接一个结构体)
  • 2.包每行均采取特殊结束标记用以区分(例如HTTP使用的\r\n)(今天的主讲)
  • 3.包前添加长度信息(所谓的TLV模式,即type、length、value)(fastcgi协议应该是这个)
  • 4.利用包本身的格式解析(如XML、JSON等)

以上1和3通常是二进制格式,2和4是文本格式。

OK.具体的协议deamo,去看欢神链接:浅谈服务端编程

详解 Http 协议(不考虑http版本)

众所周知,Http 的交流分为请求和响应。接下来就分别讲解一下下:

HTTP请求格式

  1. 请求行
  2. 请求头部字段
  3. 空行(只包含一个 `\r\n`)
  4. 请求体

实例:

  1. GET / HTTP/1.1
  2. Host: 127.0.0.1:10000
  3. Connection: keep-alive
  4. Cache-Control: max-age=0
  5. Upgrade-Insecure-Requests: 1
  6. User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.67 Safari/537.36
  7. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
请求方法:
  • OPTIONS - 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*‘的请求来测试服务器的功能性。
  • HEAD- 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
  • GET - 向特定的资源发出请求.
  • POST - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致服务器端新的资源的建立和/或已有资源的修改。
  • PUT - 向指定资源位置上传其最新内容。
  • DELETE - 请求服务器删除Request-URI所标识的资源。
  • TRACE- 回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT - HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • PATCH - 对某个资源做部分修改

方法名称都是大写的

注意:Linux有GET,POST等命令可以直接使用

请求头都有些什么?

在这里插入图片描述

HTTP响应格式

  1. 响应行
  2. 响应头
  3. 空行(只包含一个 `\r\n`)
  4. 响应体

实例:

  1. HTTP/1.0 200 OK ("协议版本 + 状态码 + 状态描述")
  2. Content-Type: text/plain
  3. Content-Length: 137582
  4. Expires: Thu, 05 Dec 1997 16:00:00 GMT
  5. Last-Modified: Wed, 5 August 1996 15:55:28 GMT
  6. Server: Apache 0.84
  7. <html>
  8. <body>Hello World</body>
  9. </html>

在这里插入图片描述

Content-Type: text/plain

关于字符的编码,1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用
下面是一些常见的Content-Type字段的值。

  1. text/plain
  2. text/html
  3. text/css
  4. image/jpeg
  5. image/png
  6. image/svg+xml
  7. audio/mp4
  8. video/mp4
  9. application/javascript
  10. application/pdf
  11. application/zip
  12. application/atom+xml

这些数据类型总称为MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔。

除了预定义的类型,厂商也可以自定义类型。
MIME type还可以在尾部使用分号,添加参数。

Content-Type: text/html; charset=utf-8
上面的类型表明,发送的是网页,而且编码是UTF-8。

客户端请求的时候,可以使用Accept字段声明自己可以接受哪些数据格式。

Accept: */*
上面代码中,客户端声明自己可以接受任何格式的数据。

MIME type不仅用在HTTP协议,还可以用在其他地方,比如HTML网页。

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  2. <!-- 等同于 -->
  3. <meta charset="utf-8" />
Content-Length 字段

目标文件的长度

Content-Encoding 字段

由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。Content-Encoding字段说明数据的压缩方法。

  1. Content-Encoding: gzip
  2. Content-Encoding: compress
  3. Content-Encoding: deflate

客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。

  1. Accept-Encoding: gzip, deflate

表示服务器传送一个 Cookie 给客户端.

BAIDUID指定Cookie 名字
expires Cookie生存时间

  • 作用:

客户端每次向服务器发送请求都要带上Cookie,服务器就能区别不同客户了,基于浏览器的自动登陆就是用Cookie实现的.

加餐:cookie 和 session 有什么区别?

  • 服务端要为特定的用户创建特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。
  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息。然后发送到服务器,服务器通过session 区别用户。(自动填充功能的实现)

http状态码

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:






























分类 分类描述
1 信息,服务器收到请求,需要请求者继续执行操作
2 成功,操作被成功接收并处理
3 重定向,需要进一步的操作以完成请求
4 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

完整的:http://www.runoob.com/http/http-status-codes.html

http/1.0,http/1.1,http/2.0 的区别以及 HTTP 与 HTTPS 有什么区别?

见 :从 Http 聊到 Https

输入一个url到浏览器页面展示都经历了哪些过程

URL处理全流程与负载均衡原理

参考:

HTTP 协议入门 阮一峰

http://0xffffff.org/2014/11/20/33-servie-program/

发表评论

表情:
评论列表 (有 0 条评论,480人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ws协议http协议

    http协议(识别数据内容)与webSocket协议 同:建立在TCP之上,同http一样通过TCP来传输数据 不同: HTTP协议为单向协议,即浏览器只能向服务器请求资