目录
1、网络字节序
小端字节序,整数的高位存储在内存地址高的位置,整数的低位存储在内存地址低的位置上
大端字节序,整数的高位存储在内存地址低的位置,整数的低位存储在内存地址高的位置上
网络字节序为大端字节序,判断方法
bool isNetByteOrder()
{
unsigned short mode = 0x1234;
char* pmode = (char*)&mode;
//低字节放低位 小端字节
if (*pmode == 0x34)
return false;
return true;
}
2、TCP和UDP区别
UDP |
TCP |
|
是否连接 |
无连接 |
面向连接 |
是否可靠 |
不可靠传输,不使用流量控制和拥塞控制 |
可靠传输,使用流量控制和拥塞控制 |
连接对象个数 |
支持一对一,一对多,多对一和多对多交互通信 |
只能是一对一通信 |
传输方式 |
面向报文 |
面向字节流 |
首部开销 |
首部开销小,仅8字节 |
首部最小20字节,最大60字节 |
适用场景 |
适用于实时应用(IP电话、视频会议、直播等) |
适用于要求可靠传输的应用,例如文件传输 |
3、TCP快速重传和拥塞机制
TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种情况,TCP报文中有一个字段提示对端接收窗口大小
4、为什么基于TCP的应用需要心跳包?
(1)TCP keep-alive是通过在空闲时发送TCP Keep-Alive数据包,然后对方回应TCP Keep-Alive ACK来实现的,默认两小时,虽然可以设置心跳时间和心跳包重发间隔,但还是不能满足应用层的实时性需求。
(2)应用层的心跳包不依赖底层协议,更灵活
(3)一个应用如果使用了socks代理,那么tcp keep-alive机制就失效了
5、Nagle算法
避免网络上大量小分组增加网络拥塞的可能,该算法要求一个 TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组
Nagle算法的规则如下:
如果包长度达到MSS,则允许发送;
如果该包含有FIN,则允许发送;
设置了TCP_NODELAY选项,则允许发送;
未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
6、TCP粘包半包产生原因及解决办法?
TCP 协议是流式协议,没有数据包的概念,连续给对端