`
文章列表
场景 考虑一个场景,tcp发动端连续发送了4个包1-200,201-300,301-400,401-500. 接收端接收了1-200, 201-300,401-500。由于301-400没有收到,所以接收端只能发送一个ack 301给发送端,以确认1-300都收到,而401-500无法给发送端确认。这时发送端不知道301-400和401-500这两个包是否到达接收端。 解决办法 处理这种情况有两种可能的方式: 仅重传超时片段:这是一种更加保守的方式,仅重传超时的片段,希望其他片段都能够成功接收。但因为发送端没法确认200后到底有多少片段没被接收,情况就比较复杂。如果该片段之后的其他 ...
一般来说timeout并不会对服务器造成什么大的影响,但如果timeout过多导致进程文件描述符不够用或服务器端口不够用就需要注意了。 下面是一些常规的timeout解决办法。注意:不是长久之计 /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;(安全)net.ipv4.tcp_tw_recycle = 0表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。(不安全)net.ipv4.tcp_fin_timeout = 3 ...
http短连接,一般是服务器端主动关闭连接(历史原因 https://www.zhihu.com/question/24338653) http 请求header头中通过Connection: 头字段来指定是否需要keep-alive。 其中http1.0和http1.1关于Connection头又有不同点 http1.0不支持keepalive,所以发 ...

重走历史

1. 50岁之前走一遍丝绸之路,体验东西历史文化交流中的物是人非 2. 去一趟中东,踏上人类文明的起源地。感受古文明的征服与被征服,文化的传播与互相影响。  路线-》波斯-伊拉克-叙利亚-埃及-突尼斯-希腊-意大利 待续
在如下几种情况会产生连接复位 1. 在另一端已经关闭连接的情况下,本端还往这个连接上(fd)读写数据 2. 一端奔溃并重新启动,另一端过来的请求会收到连接复位
进程调度优先级中PR 和NI的含义,用TOP可以看到 PR 进程的优先级。在Linux 2.6.23之前的版本中PR是一个动态值,在运行的过程中可能出现变化。大体策略是:如果一个进程sleep了比较多的时间,PR值会降低(即优先级提高);如果一个进程占用了大量的CPU时间,PR值会升高(即优先级降低)。在2.6.23版本之后,由于引进了CFS调度策略,不再简单根据一个进程sleep的时间动态调整其优先级了,PR值就固定为NI+20。CFS期望的目标是每个进程均衡地占用CPU,PR作为权重因子。 NI nice值,可用来调整进程的优先级,默认为0。如上所述,PR=NI+20,且PR越小优先级越 ...

C++ 一些小点

一些小的点,防止忘了再查资料 1.类的所有对象共享虚函数表。只不过每个对象保存一份虚函数表地址的指针 2.非虚函数在编译期就静态绑定了。
创建一个动态库时报错,如下 relocation R_X86_64_32 against `vtable for Base' can not be used when making a shared object; recompile with -fPIC ../sdk/lib/libbase.a: could not read symbols: Bad value 因为其中链接了一个静态库libbase.a g++  -fPIC -shared -I../sdk/include load.cpp helper.cpp ../sdk/lib/libbase.a -o load.so 而创建Li ...
tcp连接主动关闭的一方会有三个状态,fin_wait1, fin_wait2, time_wait 发送fin后进入fin_wait1 收到ack后进入fin_wait2 收到被动一方的fin并发送完ack后进入time_wait 主要有两个原因 1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以 主动方要处于 TIME_WAIT 状态,而不能是 ...
class Base{ public:     void test(int a);     void test(const int a);//error,不属于重载的范畴,函数名冲突.而且这么定义没意义,本来传值就不会改变原值。 } class Base{ public:     void test(int &a);     void test(const int &a);//right.属于重载 } 原因很简单。上面的参数是传值,所以肯定不会改变实参的值。传什么都行。 下面传的是引用,是可能改变原值得。所以算重载。 下面同理: class Base{ public:     ...

c++ protected误区

发现以前对protected的用法一直是错误的。 protected的继承的访问权限其实是相对于类的,而不是对象。这么说可能无法理解。看例子: class Base{ protected:     int a; public:     Base(); }; class Child{ public:     Child();     test(Child &c){         c.a = 3;     }     test2(Base &b){         b.a = 3;//error     } }; int main(){     Child child; ...

c++动态陷阱

记录以防忘记 class base{ public:     ........ }; class derive:public base{ public:     void test(); }; int main(){     derive child;     base *father = &child;     father->test();//error } father->test()会报错。因为对于非virtual函数调用,在编译期就已经确定函数地址了,只要virtual函数调用才会触发动态调用。base类是没有test方法的,所以编译通不过。

c 指针陷阱

void test(char ***s, int x, int y){     printf("%p\n", s);     printf("%p\n", s + 1);     printf("%p\n", (char *s) + 1); } 如果s的地址是0xbfe83210,则s + 1的地址是0xbfe83214,  (char *s) + 1的地址是0xbfe83211.
可能大家已经很熟悉使用strace来跟踪系统调用,今天介绍一个跟踪库函数的利器ltrace 比如我有这么一段PHP代码 test.php <?php   $y = '1380';   $arr = array();     for($i = 0; $i < 2000; $i ++){       $arr[] = "{$i}"; //故意用引号包起来设成字符串   }   for($i = 0; $i < 2000; $i ++){       if(!in_array($y, $arr)) continue;   } ?> ltrace -c ...
PHP的unserialize()方法会返回反序列化的值,如果该值为类,PHP在下面两种情况下会试图自动加载该类 1.你实现了__autoload()方法 2.设置php.ini    ini_set('unserialize_callback_func','mycallback');    当反序列化后,PHP会寻找mycallback这个方法来include这个类文件,如果你没定义这个方法则报错。    如果既没实现__autoload方法,而且unserialize_callback_func也设为0(如:ini_set('unserialize_callback_func', 0 ...
Global site tag (gtag.js) - Google Analytics