以下摘自欢神的博客:
记住,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请求格式
请求行
请求头部字段
空行(只包含一个 `\r\n`)
请求体
实例:
GET / HTTP/1.1
Host: 127.0.0.1:10000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.67 Safari/537.36
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响应格式
响应行
响应头
空行(只包含一个 `\r\n`)
响应体
实例:
HTTP/1.0 200 OK ("协议版本 + 状态码 + 状态描述")
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
Content-Type: text/plain
关于字符的编码,1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式
。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。
下面是一些常见的Content-Type字段的值。
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
这些数据类型总称为MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔。
除了预定义的类型,厂商也可以自定义类型。
MIME type还可以在尾部使用分号,添加参数。
Content-Type: text/html; charset=utf-8
上面的类型表明,发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用Accept字段声明自己可以接受哪些数据格式。
Accept: */*
上面代码中,客户端声明自己可以接受任何格式的数据。
MIME type不仅用在HTTP协议,还可以用在其他地方,比如HTML网页。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- 等同于 -->
<meta charset="utf-8" />
Content-Length 字段
目标文件的长度
Content-Encoding 字段
由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。Content-Encoding字段说明数据的压缩方法。
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。
Accept-Encoding: gzip, deflate
set-Cookie 字段
表示服务器传送一个 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到浏览器页面展示都经历了哪些过程
参考: