应用层
协议
协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些 “结构化的数据” , 该怎么办呢?
例如:
我们需要实现一个服务器版的加法器
我们需要客户端把要计算的两个数发过去, 然后由服务器进行计算, 再把结果返回给客户端
方案一
客户端发送一个形如”1+1”的字符串
这个字符串中有两个操作数, 都是整形
两个数字之间有一个字符是运算符, 运算符只能是 +
数字和运算符之间没有空格
方案二
定义结构体来表示我们需要发送的信息
发送数据时将这个结构体按照一个规则转换成字符串
接收到数据的时候再按照相同的规则把字符串转化为结构体
这个过程叫做 “序列化” 和 “反序列化”
无论我们采用方案一, 还是方案二, 还是其他的方案, 只要保证
一端发送时构造的数据, 在另一端能够正确的进行解析, 就是OK的
这种约定, 就是 应用层协议
HTTP协议
虽然说应用层协议是我们自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一.
认识 URL
我们常说的网址, 其实就是指 URL
上图解释了URL各部分的含义
urlencode和urldecode
像 / ? : 等, 这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. 如果某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY的格式
例如: 搜索C++
https://www.baidu.com/baidu?isource=infinity&iname=baidu&itype=web&tn=90171537_s_hao_pg&ch=13&ie=utf-8&wd=C%2B%2B
+ 被转成了%2B, 因为 + 号的 ASCLL码值为43, 转为16进制为2B, 加上%号, 就是%2B
上面所做的工作就叫做 urlencode
而 urldecode 就是 urlencode 的逆过程.
HTTP请求

首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;
每组属性之间使用\n分隔;
遇到空行表示Header部分结束;
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length 属性来标识Body的长度.
HTTP响应
上图空行之前的内容就是HTTP响应的头部
首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号分割的键值对;
每组属性之间使用\n分隔;
遇到空行表示Header部分结束
Body: 空行后面的内容都是Body.
Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度;
如果服务器返回了一个html页

本文介绍了应用层协议的概念,重点讲解了HTTP协议的URL结构、请求响应格式以及常见的HTTP状态码。接着,讨论了传输层的端口号分配和知名端口,以及UDP协议的不可靠性和面向数据报的特性。
最低0.47元/天 解锁文章
377

被折叠的 条评论
为什么被折叠?



