自定制协议
自定制协议:自定制协议工作在应用层,被程序员定义出来的协议,又叫应用层协议,在应用层对要传输的进行数据格式的约定,消息的发送方和接收方都应要遵守约定。
tcp的粘包问题
简单的说这个问题的就是对于消息接收方来说不能准确的区分当前数据是那一次发送过来的数据。就比如加入现在服务端提供一个加法的功能,要求客户端提供两个数字和一个“+”这样的数据,客户端先调用send函数发送1+1(中间没有空格),后来又调用一次send函数发送2+2这样一组数据,他们都被放到了发送缓冲区中(调用send函数只负责把数据放到发送缓冲区中),当在服务端调用recv接口接收数据的时候,由于它不能区分当前数据是不是一次(调用一次send)发送过来的,就可能会变成1+12+2这种情况,结果为15,但是这和我们所需要的结果不一样。
解决方法:
对于tcp粘包问题,我们可以在应用层用自定制协议增加饱=报头和分隔符的方法来解决。
【定长报头(数据长度)】 + 数据
【定长报头】 + 数据 + 分隔符
【不定长报头】 + 数据 + 分隔符
注意:(1)对于定长报头而言,数据双方都是遵守这样的约定的
(2)对于不定长的报头,由于数据也不是定长的,所以引入分隔符,而分隔符在这里起到的是左右标识当前数据的按照自定制协议传输的时候,TCP连接当中传输数据都是【报头】 + 数据 + 分隔符的方式,所以找到分隔符还可以找到下一条数据的开始。
hhttp协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
url
url其实就是我们平时上网的网址,以http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1为例子,它的每一部分表示的含义如下:

注意:这里的“/”不是Linux操作系统的根目录,而是http服务器的逻辑根目录
urlencode和urldecode
urlencode:url编码,对有通俗意义的符号进行编码
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
转义规则:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
就比如我们在浏览器里搜索一个1+1然后这里的面的+号就被转义成了%2B

urldecode:url解码,是urlencode的逆过程
HTTP数据包格式
请求
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;

本文介绍了Linux应用层的自定义协议,讨论了TCP粘包问题及其解决方案,并详细讲解了HTTP协议,包括URL、urlencode/urldecode、HTTP数据包格式(请求与响应)。最后,通过示例展示了如何编写一个简单的HTTP服务器。

4299

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



