- 浏览: 137136 次
- 性别:
- 来自: 北京
最新评论
文章列表
场景
考虑一个场景,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越小优先级越 ...
一些小的点,防止忘了再查资料
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:
...
发现以前对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;
...
记录以防忘记
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方法的,所以编译通不过。
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 ...