1. 程式人生 > >程式人生——邊學邊記

程式人生——邊學邊記

一.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的程式碼,這個可以一直看。

未完成:偽共享,瞭解一下。