sol

Linux:TCP状态/半关闭/2MSL/端口复用

萝らか妹 提交于 2021-01-07 09:35:50
TCP状态 CLOSED: 表示初始状态。 LISTEN: 该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。 SYN_SENT: 这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。 SYN_RCVD: 该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。 ESTABLISHED: 表示连接已经建立。 FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是: FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。 FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。 FIN_WAIT_2:

通过源码理解http层和tcp层的keep-alive

佐手、 提交于 2020-12-31 06:04:45
前言:最近在研究websocket和keep-alive。而websocket涉及到长连接,过多无用的长连接对系统来说是负担,是否可以尽快发现对端是否已经掉线,从而释放这个连接来减少系统压力呢,就这个初衷,通过wireshark和nodejs调试一下心跳机制。引发了一些研究和思考。 我们知道建立tcp连接的代价是比较昂贵的,每次连接需要三次握手,还有慢开始,或者建立一个连接只为了传少量数据等都影响了效率。这时候如果能保持连接,那会大大提高效率。但是如果一直保持连接,又没有数据或者有一端已经断网则会浪费资源,如何做到一个相对的取舍呢?本文通过源码来分析一下关于keep-alive的原理。读完本文,相信你会对这个问题有更多的理解。本文分成两个部分 1 http层的keep-alive 2 tcp层的keep-alive 1 http层的keep-alive 最近恰好在看nginx1.17.9,我们就通过nginx来分析。我们先来看一下nginx的配置。 keepalive_timeout timeout; keepalive_requests number; 上面两个参数告诉nginx,如果客户端设置了connection:keep-alive头。nginx会保持这个连接多久,另外nginx还支持另外一个限制,就是这个长连接上最多可以处理多少个请求。达到阈值后就断开连接

HUST软测1504班第2周作业成绩:WordCount

泪湿孤枕 提交于 2020-12-29 10:14:39
说明 本次公布的成绩为第2周个人作业WordCount的结果: 第2周个人作业:WordCount 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第2周作业第在线答疑区发帖申诉。 或直接在博客园本帖中进行评论进行申诉。 或在班级的微信群中艾特助教进行申诉。 评分细则 第2周个人作业:WordCount 本次作业总分55分,按照程序、博客两部分进行评分,其中,程序满分35分,博客满分20分。另有附加题两道,满分10分。具体细则如下表所示。 程序作业(总分35分) 源代码管理(SM,5分)。通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。 正确性(CO,8分)。应围绕需求,满足基本的正确性要求,运行结果应正确无误(将通过标准测试集来校验)。 注释(RM,2分)。程序中应有合理、明确的注释。 测试用例设计(TC,10分)。测试用例数量不少于10个(2分),测试用例设计合理(8分),至少能结合课堂介绍的方法来设计测试用例。 测试脚本(TS,10分)。测试脚本应满足典型性、可测试性、可重现性、独立性等特性。脚本设计合理,并支持良好的测试管理。 博客(20分) GitHub项目地址(GIT,1分)。在文章开头给出Github项目地址,地址缺失或错误均不得分 填写PSP表格(2分)。包括程序开发前预估的各模块开发时间,及程序各模式的实际开发时间 描述解题思路

HUST软工1501-1503班第2周作业成绩公布

本小妞迷上赌 提交于 2020-12-29 09:24:47
说明 本次公布的成绩对应的作业为: 第2周个人作业:WordCount编码和测试 如果同学对作业成绩存在异议,在成绩公布的72小时内(截止日期4月26日0点)可以进行申诉,方式如下: 毕博平台的第二周在线答疑区发申诉帖。 评分细则 本次作业总分55分,按照程序、博客两部分进行评分,其中,程序满分35分,博客满分20分。另有附加题两道,满分10分。具体细则如下表所示。 序号 评分项 评分子项 评分细则 满分 1 程序作业 (35分) 源代码管理 通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。 5分 正确性 应围绕需求,满足基本的正确性要求,运行结果应正确无误(将通过标准测试集来校验)。 8分 注释 程序中应有合理、明确的注释。 2分 测试用例设计 测试用例数量不少于10个(2分),测试用例设计合理(8分),至少能结合课堂介绍的方法来设计测试用例。 10分 测试脚本 测试脚本应满足典型性、可测试性、可重现性、独立性等特性。脚本设计合理,并支持良好的测试管理。 10分 2 博 客 (20分) Github项目地址 在文章开头给出Github项目地址,地址缺失或错误均不得分 1分 填写PSP表格 包括程序开发前预估的各模块开发时间, 及程序各模式的实际开发时间 2分 描述解题思路 刚开始拿到题目后,如何思考,如何找资料的过程。 3分 程序设计实现过程

洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

社会主义新天地 提交于 2020-12-24 04:24:30
洛谷题目传送门 emm。。。题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧。 就像 dynamic ranking 那样(蒟蒻的 Sol ,放一个link骗访问量233) 所有的值(包括初始a数组,操作1、3、4、5的k)全部先丢进去离散化 对于1操作查比它小的数,挑log棵线段树,找区间小于这个数的个数+1,这个还比较好像 操作2就是dynamic ranking,log棵线段树一起加减,像静态主席树求第k小一样跳,操作3 dynamic ranking里也有 操作4先求小于这个数的个数,那么前驱的排名就等于这个个数,注意特判0就好了。 操作5也是先求排名再去找这个数,排名是小于且等于这个数的个数(等于查小于这个数在值域里加+1的数排名) 拼命卡常(小技巧,发现当前跳到的点size已经为0了就不用再往下跳了),然而常数还是丑。。。说不定应该破掉非递归版跑的比递归版多多少少快一点的谣言了? #include<cstdio> #include<cstring> #include<algorithm> #define RG register #define R RG int #define II inline int #define IV inline void #define gc if(++pi==iend)fread(pi=ibuf,1,SZ

python网络-Socket之udp编程(24)

假如想象 提交于 2020-12-19 12:59:09
一、udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。 udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。 udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 udp是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 二、udp特点: udp是面向无连接的通讯协议,udp数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 udp传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 udp是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。udp是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,udp一般用于多点通信和实时的数据业务,比如: 语音广播 TFTP(简单文件传送) SNMP(简单网络管理协议) RIP(路由信息协议,如报告股票市场,航空信息) DNS(域名解释) 三、udp网络程序-发送数据 创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: # coding=utf-8

python网络编程(UDP+广播)

半世苍凉 提交于 2020-12-19 12:37:15
UDP广播案例,一端发送,多端接受: 发送端: # UDP广播案例 from socket import * from time import sleep # 设定目标地址 dest=( ' 176.215.122.255 ' ,6666 ) s = socket(AF_INET,SOCK_DGRAM) s.setsockopt(SOL_SOCKET,SO_BROADCAST, 1 ) data = ' 本人到此一游 ' while True: sleep( 2 ) s.sendto(data.encode(),dest) s.close() 接收端: # udp广播案例 from socket import * s = socket(AF_INET,SOCK_DGRAM) # 设置套接字 s.setsockopt(SOL_SOCKET,SO_BROADCAST,1 ) # 选择一个接收地址 s.bind(( ' 0.0.0.0 ' ,9821 )) while True: try : msg,addr =s.recvfrom(1024 ) print ( ' from %s bg %s ' % (addr,msg.decode())) except KeyboardInterrupt: break except Exception as e: print (e) s.close(

Python网络编程—UDP套接字广播

谁都会走 提交于 2020-12-19 11:31:17
广播定义 : 一端发送多点接收 广播地址 : 每个网络的最大地址为发送广播的地址,向该地址发送,则网段内所有主机都能接收。 """ 创建udp套接字 设置套接字可以接收广播 选择接收端口 """ from socket import * s = socket(AF_INET,SOCK_DGRAM) # 让套接字接收广播 s.setsockopt(SOL_SOCKET,SO_BROADCAST,1 ) s.bind(( " 0.0.0.0 " ,8888 )) while True: msg,addr =s.recvfrom(1024 ) print (msg.decode()) s.close() broadcast_recv 1 """ 2 发送广播 3 """ 4 from socket import * 5 import time 6 dest=( ' 176.100.7.255 ' ,8888 ) 7 s= socket(AF_INET,SOCK_DGRAM) 8 s.setsockopt(SOL_SOCKET,SO_BROADCAST,1 ) 9 data= """ 10 人生苦短,我用Python. 11 """ 12 while True: 13 time.sleep(2 ) 14 s.sendto(data.encode(),dest) 15 print (data

[UOJ46][清华集训2014]玄学

牧云@^-^@ 提交于 2020-12-13 21:41:21
uoj description 给出$n$个变换,第$i$个变换是将区间中$l_i,r_i$的数$x$变成$(a_ix+b_i)\mod m$。 每次会新增一个变换,或者查询询问如果进行编号$[s,t]$的操作,第$k$个数会变成多少。 $n\le10^5,q\le6\times10^5$ sol 二进制分组。 按顺序把变化插入线段树,如果线段树的某个满了就向上归并两个儿子的变换。 $a_j(a_ix+b_i)+b_j=a_ia_jx+a_jb_i+b_j$就是两个变换的合并。 查询的时候找到线段树的对应节点(这些节点一定都是合并好了的),然后在维护出的变化序列上二分找到第$k$个位置,直接算即可。 code #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int gi(){ int x=0,w=1;char ch=getchar(); while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if (ch=='-') w=0,ch=getchar(); while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return w?x:-x; } const int N =

Python 黏包及黏包解决方案

巧了我就是萌 提交于 2020-12-08 08:33:05
粘包现象      说粘包之前,我们先说两个内容,1.缓冲区、2.windows下cmd窗口调用系统指令    1 缓冲区(下面粘包现象的图里面还有关于缓冲区的解释)           每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write() / send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。 TCP协议独立于 write() / send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。 read() / recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。 这些I / O缓冲区特性可整理如下: 1.I/ O缓冲区在每个TCP套接字中单独存在; 2.I/ O缓冲区在创建套接字时自动生成; 3 .即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 4 .关闭套接字将丢失输入缓冲区中的数据。 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取: 1 .unsigned