当前位置: 首页 > news >正文

建设网站开发方案为企业策划一次网络营销活动

建设网站开发方案,为企业策划一次网络营销活动,可制作网页的软件,在线网页制作系统免费下文中的内容多数来自【参考】中的文章,这边进行一个整理和总结,后续会慢慢增加出现各个 RST 包的测试代码,便于理解。 TCP的 “断开连接” 标志 RST 标志 Reset,复位标志,用于非正常地关闭连接。它是 TCP 协议首部里…

下文中的内容多数来自【参考】中的文章,这边进行一个整理和总结,后续会慢慢增加出现各个 RST 包的测试代码,便于理解。

TCP的 “断开连接” 标志

  1. RST 标志

    Reset,复位标志,用于非正常地关闭连接。它是 TCP 协议首部里的一个标志位。发送 RST 包关闭连接时,直接丢弃缓冲区的包并发送 RST 包,而接收端收到 RST 包后,也不必发送 ACK 包来确认。

    TCP 套接字在任何状态下,只要收到 RST 包,即可进入 CLOSED 初始状态,不会有任何回应。至于是否通知上层应用,要根据应用程序是阻塞模式还是非阻塞模式:

    • 阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用 read() 或者 write() 这样的 IO 系统调用时,内核才会利用出错来通知应用层对端 RST。
    • 非阻塞模型下,select 或者 epoll 会返回 sockfd 可读,应用层对其进行读取时,read() 会报错 RST。
  2. FIN 标志

    发端完成发送任务标识。用来释放一个连接。FIN=1 表明此报文段的发送端的数据已经发送完毕,并要求释放连接。

  3. RST 和 FIN 的区别

    • 正常地关闭连接用 FIN 标志位,但 FIN 标志位不能用来处理异常情况;
    • RST 会导致连接立即终止,而在 FIN 中会得到确认。

TCP 出现 RST 包的情况

  1. 连接未监听的端口

    连接一个未监听的端口,则被连接方会发送一个 RST。也就是说主机传输层 TCP 程序接收到一个 SYN 包,而这个 SYN 包目的端口并没有 socket 监听,那么主机的协议栈会直接回复一个 RST。

  2. 向已关闭的连接发送数据

    顾名思义,主机传输层 TCP 协议程序接收到一条 TCP 数据段,而目的端口并没有 socket 监听,那么主机的协议栈会直接回复一个 RST。

  3. 向已关闭的连接发送 FIN

    主机传输层 TCP 协议程序接收到一条 FIN,而目的端口并没有 socket 监听,那么主机的协议栈会直接回复一个 RST。

  4. 向已经消逝的连接中发送数据

    和上面的举例相同。

  5. 处理半打开连接

    一方关闭了连接,另一方却没有收到结束报文(如网络故障),此时另一方还维持着原来的连接。而一方即使重启,也没有该连接的任何信息。这种状态就叫做半打开连接。而此时另一方往处于半打开状态的连接写数据,则对方回应 RST 复位报文。此时会出现 connect reset by peer 错误。详见下文测试代码。

  6. 目的主机或网络路径中的防火墙拦截

    如果目的主机或者网络路径中显式的设置了对数据包的拦截,如使用 iptables 对主机的防火墙添加了一条规则,对于目的端口是 6000 的 TCP 报文,丢弃并回复 RST。

  7. TCP 接收缓冲区 Recv-Q 中的数据未完全被应用程序读取时关闭该 socket

    接收到的数据缓存在缓冲区 Recv-Q,它们等待被上层应用取走,如果缓冲区 Recv-Q 有数据未被应用取走,而此时调用 close 函数关闭 TCP 连接,那么 TCP 协议程序发送的就不是 FIN,而是 RST。此时会出现 Connection reset by peer 错误,详见下文测试代码。

  8. 请求超时后收到回复

    主机创建 socket,设置 SO_RCVTIMEOUT 选项为100ms,向对端发送 SYN,超过100ms后才收到 ACK+SYN,那么主机的协议栈会直接回复一个 RST。

  9. SO_LINGER

    socket 设置 SO_LINGER 选项,socket 调用 close 函数时,会直接丢弃缓冲区 Send_Q 未发完的数据,并发送 RST。

  10. Linux 下启用 TIME_WAIT 快速回收

    修改 /etc/sysctl.conf 中内核参数:net.ipv4.tcp_tw_recycle = 1,当收到的 SYN 包的 timestamp 比上次的小时,就会发 RST。

  11. 移动链路

    移动网络下,国内是有5分钟后就回收信令,也就是 IM 产品,如果心跳>5分钟后服务器再给客户端发消息,就会收到 RST。也要查移动网络下 IM 保持<5min 心跳。

  12. GFW

    防火长城(Great Firewall of China,简称GFW)是中国政府在互联网空间中发起的一项大规模干预措施,旨在审查并控制中国地区的互联网使用,以遏制虚假信息、不良内容和外部信息流入中国境内。防火长城被普遍认为是政府和监管机构利用技术工具监控国家居民上网行为的全球最大系统,而它的技术基础上,有多种关键的审查与监管工具,如域名解析服务(DNS)、网络流量检测和内容过滤系统(CFMS)等。

  13. 负载等设备

    负载设备需要维护连接转发策略,长时间无流量,连接也会被清除,而且很多都不告诉两层机器,新的包过来时才通告 RST。

    Apple push 服务也有这个问题,而且是不可预期的偶发性连接被 RST;RST 前第一个消息 write 是成功的,而第二条写才会告诉你连接被重置,

    曾经被它折腾没辙,因此打开每2秒一次 tcp keepalive,固定5分钟 TCP 连接回收,而且发现连接出错时,重发之前10s内消息。

  14. 超过超时重传次数

  15. seq 不正确

  16. keepalive 超时

    公网服务 tcp keepalive 最好别打开;移动网络下会增加网络负担,切容易掉线;非移动网络核心 ISP 设备也不一定都支持 keepalive,曾经也发现过广州那边有个核心节点就不支持。

  17. 数据错误,不是按照既定序列号发送数据

测试代码

  1. 上述第6种情况【TCP 接收缓冲区 Recv-Q 中的数据未完全被应用程序读取时关闭该 socket】

    客户端测试代码:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <fcntl.h>int main(void)
    {int len;int sockFd;char sendBuf[256];struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);addr.sin_port = htons(8888);if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket error");return -1;}if (connect(sockFd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("connect error");close(sockFd);return -1;}memset(sendBuf, 0xFF, sizeof(sendBuf));send(sockFd, sendBuf, sizeof(sendBuf), 0);len = recv(sockFd, sendBuf, sizeof(sendBuf), 0);if (len >= 0){printf("len: %d\n", len);}else{printf("[line:%d] errno: %d, strerror(errno): %s\n", __LINE__, errno, strerror(errno));		}close(sockFd);return 0;
    }
    

    服务端测试代码:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <fcntl.h>int main(void)
    {int readLen;int sockFd;int clientFd;char recvBuf[128] = {0};struct sockaddr_in saddr;if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket error");return -1;}bzero((void*)&saddr, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = htonl(INADDR_ANY);saddr.sin_port = htons(8888);if (bind(sockFd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("bind error");close(sockFd);return -1;}if (listen(sockFd, 5) < 0){perror("listen error");close(sockFd);return -1;}printf("accept waiting, sockFd: %d\n", sockFd);if ((clientFd = accept(sockFd, NULL, NULL)) == -1){perror("accept error");close(sockFd);return -1;}while (1){memset(recvBuf, 0, sizeof(recvBuf));readLen = recv(clientFd, recvBuf, sizeof(recvBuf), 0);if (readLen > 0){printf("readLen: %d\n", readLen);}else if (readLen == 0){printf("client fd is closed!\n");close(clientFd);break;}else {printf("[line:%d] errno: %d, strerror(errno): %s\n", __LINE__, errno, strerror(errno));close(clientFd);break;}close(clientFd);break;}close(sockFd);return 0;
    }
    

    服务端输出:
    在这里插入图片描述

    客户端输出:
    在这里插入图片描述

    wireshark 抓包结果:
    在这里插入图片描述

    该举例中,客户端发送256字节的数据到服务端,服务端只接收了128字节的数据就关闭了套接字,此时服务端的 TCP 接收缓冲区中还剩128字节未读取,所以服务端发送 RST 到客户端。

  2. 上述第5种情况【处理半打开连接】

    客户端测试代码:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <fcntl.h>int main(void)
    {int len;int sockFd;char sendBuf[256];struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);addr.sin_port = htons(8888);if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket error");return -1;}if (connect(sockFd, (struct sockaddr *)&addr, sizeof(addr)) < 0){perror("connect error");close(sockFd);return -1;}memset(sendBuf, 0xFF, sizeof(sendBuf));send(sockFd, sendBuf, sizeof(sendBuf), 0);sleep(1);send(sockFd, sendBuf, sizeof(sendBuf), 0);close(sockFd);return 0;
    }
    

    服务端测试代码:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <fcntl.h>int main(void)
    {int readLen;int sockFd;int clientFd;char recvBuf[256] = {0};struct sockaddr_in saddr;if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket error");return -1;}bzero((void*)&saddr, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = htonl(INADDR_ANY);saddr.sin_port = htons(8888);if (bind(sockFd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("bind error");close(sockFd);return -1;}if (listen(sockFd, 5) < 0){perror("listen error");close(sockFd);return -1;}printf("accept waiting, sockFd: %d\n", sockFd);if ((clientFd = accept(sockFd, NULL, NULL)) == -1){perror("accept error");close(sockFd);return -1;}while (1){memset(recvBuf, 0, sizeof(recvBuf));readLen = recv(clientFd, recvBuf, sizeof(recvBuf), 0);if (readLen > 0){printf("readLen: %d\n", readLen);}else if (readLen == 0){printf("client fd is closed!\n");close(clientFd);break;}else {printf("[line:%d] errno: %d, strerror(errno): %s\n", __LINE__, errno, strerror(errno));close(clientFd);break;}close(clientFd);break;}close(sockFd);return 0;
    }
    

    wireshark 抓包结果: 在这里插入图片描述

    该举例中,客户端发送数据到服务端,服务端将数据接收后就关闭了套接字,随后,客户端又发送数据到服务端,因为此时服务端已将套接字关闭,所以服务端会发送 RST 到客户端。

参考

[1] https://zhuanlan.zhihu.com/p/361714600
[2] https://baijiahao.baidu.com/s?id=1632327385547303797&wfr=spider&for=pc
[3] https://www.cnblogs.com/JohnABC/p/6323046.html
[4] https://www.pianshen.com/article/8750375150/

http://www.hrbkazy.com/news/31877.html

相关文章:

  • 网站模板但没有后台如何做网站知名网站
  • 佛山精品网站建设武汉刚刚发生的新闻
  • 网站美工建设意见怎么找关键词
  • 郑州建设厅官方网站灰色行业推广平台
  • 电子商务网站建设的重要行b2b网站平台有哪些
  • 自己做都网站怎么发朋友圈百度建站云南服务中心
  • 深圳南山做网站热狗seo顾问
  • 做造价在哪个网站查价格百度推广话术全流程
  • 做网站前端代码网站模板
  • 网站开发文章怎么找推广渠道
  • 北京品牌高端网站建设公司免费的网站推广平台
  • 淄博哪里有网站建设平台免费顶级域名注册
  • 新乡网站seo优化专门的网页制作工具有
  • 手机企业网站怎么做aso优化师工作很赚钱吗
  • 网站 建设 流行 数据库搜索引擎有哪些平台
  • 网络有限公司做女装网站的汕头seo收费
  • 网站注销备案查询系统青岛网站建设方案
  • 郑州做网站制作的公司seo模拟点击软件源码
  • 南京公司做网站seo点击排名工具
  • 图片怎么上传到wordpress小吴seo博客
  • 软件是怎么做的扬州网站seo
  • 网站推广软文欣赏全网营销整合营销
  • 秦皇岛网站制作电话搜一搜搜索
  • 大良营销网站建设服务壹起航网络推广的目标
  • 动态电子商务网站建设报告新野seo公司
  • 官方网站建设维护合作协议seo技术培训机构
  • 投标网站怎么做交换友情链接的平台有哪些
  • 仁怀企业网站建设网站推广应该坚持什么策略
  • jsp网站架设优化营商环境心得体会
  • 网站建设人员需求百度知道官网入口