TCP和UDP知识总结
Posted kerwincui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP和UDP知识总结相关的知识,希望对你有一定的参考价值。
1.TCP粘包:Tcp是面向连接、流式传送的,没有明确的边界定义。他有一个缓冲区,每过一段时间或者缓存满了就发送出去,造成一次发送的数据可能是多个包或者包的一部分,这就是发送端的粘包。接收端的粘包指应用程序没有及时处理缓冲区中的数据,后续到达的数据继续放到缓存中。
解决方法:
a.对发送的数据划分边界,采用“数据长度+实际数据”的格式来发送。
b.包尾添加特殊分隔符
c.报文大小固定不变,不够空格补全。
粘包情况是无法绝对避免的,因为网络环境很复杂。
封包:给数据加上包头,用来划分数据边界。
拆包:根据包头定义的数据边界,分割成多个包。
2.UDP丢包:一种无连接的传输协议,优点:速度快,缺点是:数据包无序并且容易丢失。
丢包原因:
a.包发送的频率太快 避免复杂操作(多线程回调机制)
b.接收端处理时间过长 及时接收数据
c.发送的包太大 控制报文大小
3.数据包:TCP/IP协议通信传输中的数据单位。
数据包主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成,包括包头和包体,包头是固定长度,包体的长度不定,各字段长度固定,双方的请求数据包和应答数据包的包头结构是一致的,不同的是包体的定义。TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。
4.数据帧:“帧”数据由两部分组成:帧头和帧数据。帧头包括接收方主机物理地址的定位以及其它网络信息。帧数据区含有一个数据体。
5.字节:计量存储容量的一种计量单位。
数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。1个字节等于8位二进制。
6.位运算
按位与&:如果两个相应的二进位数为1,刚该位的结果为 1 否则为 0 。
按位或|:两个相应的二进位中只要有一个为 1,该位的结果就为 1。
XOR异或^:若参加运算的两个二进位同号,则结果为0,异号则为1。
取反 ~ :用来对一个二进制按位取反。
左移运算符<<:用来将一个数各二进位全部左移若干位。
高位左移后溢出,舍弃不起作用。
左移一位相当于该数乘以2。但些结论只适用于该数左移时被溢出舍弃的高位中不包含1 的情况。
左移比乘法运算快得多,有些C编译程序自动将乘2的运算用左移来实现。
右移运算符>>:用来将一个数各二进位全部右移若干位。
右移一位相当于除以 2 ,右移 n 位相当于除于 2^n。
在右移时,需要注意符号位问题。对无符号数,右移时左边高位移入 0。对于有符号的值,如果原来符号位为 0 (该数为正),则左边也是移入 0,如果上例表示的那样,如果符号位原来为 1(该数为负),则左边移入的 0 还是 1 ,要取决于所用的计算机系统。移入 0 称为 逻辑右移,即简单右移。移入 1 称为 算术右移。
不同长度的数据进行位运算:如果两个数据长度不同(例如 long 型和 int 型)进行位运算时(如 a & b 而 a 为 long型,b 为 int 型),系统会将二者按右端对齐。如果 b 为正数,则左侧 16 位补满 0。若 b 为负数,左端应补满 1。如果 b 为无符号整数型,则左侧补满 0。
以上是关于TCP和UDP知识总结的主要内容,如果未能解决你的问题,请参考以下文章