流式协议
tcp是一种流式协议
发送端应用层调用send函数完成数据发送以后,数据并没有真正从网络上发送出去,只是从应用程序拷贝到了操作系统内核协议栈。真正发送的时刻和数据大小,取决于发送窗口、拥塞窗口以及当前发送缓冲区大小等。eg:当我们发送A和B字符串,这两个字符串可以在同一个分组中被发送出去,也可以分为多个分组发送出去。接收端会根据序号进行拼接。如果发送过程中有TCP分组丢失,后续的分组陆续到达,则TCP协议栈会缓存后续的分组,直到前面丢失的分组到达。
网络字节序
大端字节序:高位在低地址,符合我们日常书写
eg:0x0201
注:如果是传输ASCII码,因为ASCII码是8位的字节组成的,因此不会涉及到大端序和小端序,直接对字节流做解码即可。
报文粘包问题
原因
解析报文时候,如果确定报文的边界很重要,不然会导致解析失败
做法
报文长度
发送端预先把报文长度发给接收端
特殊字符
利用特殊的字符作为边界
例子:http报文格式,通过设置回车符、换行符作为HTTP报文协议的边界
思考:用特殊字符作为结尾,进行报文解析的时候,需要对换行符和换行回车符都做处理?
因为Unix下文件的结尾只有\n,但windows下文件的结尾是\r\n,服务端收到报文,不知道是来自哪种系统的,因此都要做处理。