一、Linux socket Api
TCP连接:
UDP连接:
MTU(以太网数据帧物理特性是其长度必须在46~1500字节之间)
==》单个UDP传输的最大内容1472字节(1500-20(IP数据头)-8(UDP数据头),如果有可选字节大于28),不过由于不同网络设备MTU值不同,一般将UDP数据控制在548字节。
SCTP:
-
SCTP和TCP之间的最大区别是SCTP的连接可以是多宿主连接的,TCP则一般是单地址连接的。在进行SCTP建立连接时,双方均可声明若干IP地址(IPv4,Ipv6或主机名)通知对方本端所有的地址,引入了 联合(association) 的概念,它也是存在于两台主机之间,但可以使用每台主机上的多个接口进行协作。
-
其次SCTP是基于消息流,而TCP则是基于字节流。所谓基于消息流,是指发送数据和应答数据的最小单位是消息包(chunk)
-
不同于TCP连接采用的三次握手机制,SCTP连接采用四次握手机制,有效的防止了类似于SYN Flooding的防范拒绝服务攻击。
-
SCTP 在数据传输中提供了消息分帧功能。
int socket (int domain, int type, int protocol); // 返回套接字句柄
struct sockaddr_in{
sa_family_t sin_family; // 地址簇
uint16_t sin_port; // 端口
struct in_addr sin_addr; // IP地址
char sin_zero[8]; // 不适用
}
int bind (int sockfd, struct sockaddr * my_addr, int addrlen); // 为句柄设置端口、IP
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen); // 连接
int listen (int sockfd, int backlog); // 开始监听连接
int accept (int sockfd, void * addr, int * addrlen); // 阻塞态等待连接
int send (int sockfd, const void * msg, int len, int flags); // 发送数据
int recv (int sockfd, void * buf, int len, unsigned int flags); // 接收数据
close()
二、boost asio
三、TCP/IP连接问题排查及解决
socket常见错误码:
10053 网络应用程序尝试发送的数据超出了网络的带宽或处理能力,从而导致数据发送失败。
10054 在客户端与服务端通信时服务端终止了连接。
10060 通常是远程服务器没有响应,可能是因为远程服务器不正常运行或出于某种原因关闭
10061 远程服务器拒绝连接,一般是由于防火墙设置所致
window下wireshark抓包分析工具
linux下查看tcp状态工具
netstat -nat // 查看tcp各个状态的数量
lsof -i:port // 检测打开套接字的情况
sar -n SOCK // 查看tcp创建的连接数
ping // 检测网络连接正常与否
tcpdump 抓包工具
TCP常见故障排查:
1、丢包、错包
ethtool -S ens32|grep errors 统计丢包、错包
原因可能是网线或网卡问题
2、队列溢出
TCP有SYN Queue和Accept Queue
使用ss -lnt|expand 工具查看服务端
step1: ping排除网络连接情况
step2: 网络工具尝试连接,若能连接转到step5,
step3: 查看客户端返回报错,初步判断错误类型
step4: 登录服务端查看服务端进程,使用netstat、sar、lsof、ss等工具排除服务端进程问题
step5: tcpdump抓包