TCP编程常见问题

目录

1、网络字节序

2、TCP和UDP区别

3、TCP快速重传和拥塞机制

4、为什么基于TCP的应用需要心跳包?

5、Nagle算法

6、TCP粘包半包产生原因及解决办法?

7、TCP如何保证有序

8、常用的TCP选项

8.1 SO_REUSEADDR

8.2 SO_RCVBUF 和 SO_SNDBUF

8.3 SO_RCVLOWAT 和 SO_SNDLOWAT

8.4 SO_LINGER

9、UDP 调用connect

9.1 和TCP调用connect区别

9.2 UDP调用connect以后数据收发接口变化

10. send和recv函数调用

10.1 函数行为

10.2 返回值

11、SYN Flood攻击

11.1 什么是SYN Flood攻击

11.2 如何解决

12.socket函数常见errno处理

12.1 EPIPE

12.2 EINTR 操作被信号中断

12.3 EWOUDBLOCK 或 EAGAIN 

12.4 EINPROGRESS 

13 设置socket为非阻塞


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 协议是流式协议,没有数据包的概念,连续给对端

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值