版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hk1048868042/article/details/83414947
一.tcp协议中的序列号与确认号
传输数据的简要过程如下:
(由于服务端发送的包中确认收到了客户端发送的SYN,故客户端的序列号由0变为1)
1) 发送数据:服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;
2) 确认收到:客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。
数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
简言之:三步握手的序列号和确认序列号变化:
SYN包: seq number=0; ack number=0;
SYN+ACK包:seq number=(前一个包的ack number)=0; ack number=1;(由于服务端发送的包中确认收到了客户端发送的SYN,故客户端的序列号由0变为1);
接下来的数据包:1.seq number=(前一个包的ack number)=1;ack number=1; (注意这个包有负载了,假设其负载数据大小为22)
再接下来的包2.seq number=(前一个包的ack number)=1;ack number=(前一个包的seq number+前一个包的数据大小22)=23;
———————————————————————————分割线———————————————————————————
二.关于返回局部变量的一些感触
代码如下:
1.以下为重点:第一,不能返回局部变量,但是可以返回局部的类。
test fun()
{
test aaa;
aaa.aa=10;
return aaa;
}
class test{
public:
int a;
test()
{
printf("构造函数\n");
}
~test()
{
printf("析构函数\n");
}
test& operator =(const test& src)
{
printf("重载=号\n");
}
test (const test& src)
{
printf("拷贝构造函数\n");
}
};
int main()
{
test bbb;
bbb=fun();//首先返回fun函数里面的局部类变量会首先生成一个临时的类变量,先把局部变量拷贝到零时变量之后,再删除局部变量。其次当本条语句结束之后再删除零时变量。
test ccc=fun();//这个不会生成零时的变量,而且只会调用拷贝函数。
test ddd;
ddd=ccc;//这个只会调用重载=号
return 0;
}
未完成:记住看一下那个disruptor的代码,这个可以一直看。
未完成:伪共享,了解一下。