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

网站建设动态实训报告菜鸟教程官网

网站建设动态实训报告,菜鸟教程官网,能解析国外网站的dns,wordpress背景透明下文中的内容多数来自【参考】中的文章#xff0c;这边进行一个整理和总结#xff0c;后续会慢慢增加出现各个 RST 包的测试代码#xff0c;便于理解。 TCP的 “断开连接” 标志 RST 标志 Reset#xff0c;复位标志#xff0c;用于非正常地关闭连接。它是 TCP 协议首部里…下文中的内容多数来自【参考】中的文章这边进行一个整理和总结后续会慢慢增加出现各个 RST 包的测试代码便于理解。 TCP的 “断开连接” 标志 RST 标志 Reset复位标志用于非正常地关闭连接。它是 TCP 协议首部里的一个标志位。发送 RST 包关闭连接时直接丢弃缓冲区的包并发送 RST 包而接收端收到 RST 包后也不必发送 ACK 包来确认。 TCP 套接字在任何状态下只要收到 RST 包即可进入 CLOSED 初始状态不会有任何回应。至于是否通知上层应用要根据应用程序是阻塞模式还是非阻塞模式 阻塞模型下内核无法主动通知应用层出错只有应用层主动调用 read() 或者 write() 这样的 IO 系统调用时内核才会利用出错来通知应用层对端 RST。非阻塞模型下select 或者 epoll 会返回 sockfd 可读应用层对其进行读取时read() 会报错 RST。 FIN 标志 发端完成发送任务标识。用来释放一个连接。FIN1 表明此报文段的发送端的数据已经发送完毕并要求释放连接。 RST 和 FIN 的区别 正常地关闭连接用 FIN 标志位但 FIN 标志位不能用来处理异常情况RST 会导致连接立即终止而在 FIN 中会得到确认。 TCP 出现 RST 包的情况 连接未监听的端口 连接一个未监听的端口则被连接方会发送一个 RST。也就是说主机传输层 TCP 程序接收到一个 SYN 包而这个 SYN 包目的端口并没有 socket 监听那么主机的协议栈会直接回复一个 RST。 向已关闭的连接发送数据 顾名思义主机传输层 TCP 协议程序接收到一条 TCP 数据段而目的端口并没有 socket 监听那么主机的协议栈会直接回复一个 RST。 向已关闭的连接发送 FIN 主机传输层 TCP 协议程序接收到一条 FIN而目的端口并没有 socket 监听那么主机的协议栈会直接回复一个 RST。 向已经消逝的连接中发送数据 和上面的举例相同。 处理半打开连接 一方关闭了连接另一方却没有收到结束报文如网络故障此时另一方还维持着原来的连接。而一方即使重启也没有该连接的任何信息。这种状态就叫做半打开连接。而此时另一方往处于半打开状态的连接写数据则对方回应 RST 复位报文。此时会出现 connect reset by peer 错误。详见下文测试代码。 目的主机或网络路径中的防火墙拦截 如果目的主机或者网络路径中显式的设置了对数据包的拦截如使用 iptables 对主机的防火墙添加了一条规则对于目的端口是 6000 的 TCP 报文丢弃并回复 RST。 TCP 接收缓冲区 Recv-Q 中的数据未完全被应用程序读取时关闭该 socket 接收到的数据缓存在缓冲区 Recv-Q它们等待被上层应用取走如果缓冲区 Recv-Q 有数据未被应用取走而此时调用 close 函数关闭 TCP 连接那么 TCP 协议程序发送的就不是 FIN而是 RST。此时会出现 Connection reset by peer 错误详见下文测试代码。 请求超时后收到回复 主机创建 socket设置 SO_RCVTIMEOUT 选项为100ms向对端发送 SYN超过100ms后才收到 ACKSYN那么主机的协议栈会直接回复一个 RST。 SO_LINGER socket 设置 SO_LINGER 选项socket 调用 close 函数时会直接丢弃缓冲区 Send_Q 未发完的数据并发送 RST。 Linux 下启用 TIME_WAIT 快速回收 修改 /etc/sysctl.conf 中内核参数net.ipv4.tcp_tw_recycle 1当收到的 SYN 包的 timestamp 比上次的小时就会发 RST。 移动链路 移动网络下国内是有5分钟后就回收信令也就是 IM 产品如果心跳5分钟后服务器再给客户端发消息就会收到 RST。也要查移动网络下 IM 保持5min 心跳。 GFW 防火长城Great Firewall of China简称GFW是中国政府在互联网空间中发起的一项大规模干预措施旨在审查并控制中国地区的互联网使用以遏制虚假信息、不良内容和外部信息流入中国境内。防火长城被普遍认为是政府和监管机构利用技术工具监控国家居民上网行为的全球最大系统而它的技术基础上有多种关键的审查与监管工具如域名解析服务DNS、网络流量检测和内容过滤系统CFMS等。 负载等设备 负载设备需要维护连接转发策略长时间无流量连接也会被清除而且很多都不告诉两层机器新的包过来时才通告 RST。 Apple push 服务也有这个问题而且是不可预期的偶发性连接被 RSTRST 前第一个消息 write 是成功的而第二条写才会告诉你连接被重置 曾经被它折腾没辙因此打开每2秒一次 tcp keepalive固定5分钟 TCP 连接回收而且发现连接出错时重发之前10s内消息。 超过超时重传次数 seq 不正确 keepalive 超时 公网服务 tcp keepalive 最好别打开移动网络下会增加网络负担切容易掉线非移动网络核心 ISP 设备也不一定都支持 keepalive曾经也发现过广州那边有个核心节点就不支持。 数据错误不是按照既定序列号发送数据 测试代码 上述第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.hint 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.hint 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 到客户端。 上述第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.hint 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.hint 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?id1632327385547303797wfrspiderforpc [3] https://www.cnblogs.com/JohnABC/p/6323046.html [4] https://www.pianshen.com/article/8750375150/
http://www.hkea.cn/news/14524883/

相关文章:

  • 网站自适应代码app推广是什么工作
  • 新浪云sae免费wordpress网站8小8x人成免费观看网页
  • 安徽中擎建设公司网站搭建合作平台
  • 宁波专业做网站的公司哪家好cad培训班一般学费多少钱
  • 临沧网站建设临沧wordpress 不提示更新
  • 旅游网站管理系统php广州市重点公共建设项目官网
  • 网站怎样添加友情链接手机网站建设好吗
  • 网站代备案公司抽奖的网站怎么做
  • 包装设计接单网站wordpress 分类的地址
  • 广东智能网站建设哪家有速加网零件加工网
  • 专门做物业催收的网站横岗网站建设
  • 上海电商网站建设公司排名网站开发 精品课程
  • 内江网站建设0832hdsj做网站的钱付款用途写什么
  • 佛山市网站建站网站小工程承包信息网
  • 湖南省住房和城乡建设厅门户网站企业网站推广方案范例
  • 阿里巴巴国际站入驻费用及条件ui设计师培训班
  • 网站建设vps建设网站的价格表
  • 漯河做网站哪家好花桥网站建设公司
  • 沈阳网站设计推广做一套网站多钱
  • 石家庄有什么做网站的公司网站开发 功能不会写
  • 学网站建设软件开发潍坊网站建设联系方式
  • 网站开发在哪个科目核算做营销网站哪家好
  • 同仁行业网站建设报价wordpress迁移空间插件
  • 网站上添加百度地图阿里巴巴装修网站
  • 怎么看网站是用什么系统做的免费在线观看电影电视剧网站
  • 做毕设网站多少钱教育网站模块建设
  • 设计师对网站的意义网页模板是已经做好的
  • 网站建设前的功能网站反链增加
  • 网站建设山东公司haai商城网站建设公司排名
  • 网站建设 动态添加内容seo网络专员招聘