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。

猜你喜欢

转载自www.cnblogs.com/kerwincui/p/9579303.html
今日推荐