TCP的結構在中定義為:
struct tcphdr
{
u_int16_t source; //發送TCP資料的源連接埠
u_int16_t dest; //發送TCP資料的目標連接埠
u_int32_t seq; //標識該TCP所包含的資料位元組的開始序號
u_int32_t ack_seq; //確認序號表示接受方下次需要的序號
#if __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res1:4; //
u_int16_t doff:4; //資料首部長度,一般為5
u_int16_t fin:1; //為1表示親戚關係串連
u_int16_t syn:1; //為1表示請求串連
u_int16_t rst:1; //ret為1,表示重新串連
u_int16_t psh:1; //為1表示接收方收到資料立即交到上層
u_int16_t ack:1; //如果確認號正確,那麼為1
u_int16_t urg:1; //為1表示為緊急資料
u_int16_t res2:2; //
#elif __BYTE_ORDER == __BIG_ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#endif
u_int16_t window; //視窗,告訴接收者可以接收的大小
u_int16_t check; //對tcp資料進行較核
u_int16_t urg_prt; //如果urg=1,那麼指出緊急資料對於曆史資料開始的序號的位移值
};
關於TCP協議的詳細情況,請查看 RFC793
TCP串連的三向交握
c端 假設序號為1000 s端 假設序號為2000
1、syn=1;seq=1000 ---TCP包---〉if(syn ==1){
ack = 1;ack_seq=1001;
2、 if(ack==1 && ack_seq==1001)<---TCP包---- seq = 2000;}
{ack = 1; ack_seq = 2001;
3、 seq = 1001; } ----TCP包----> if(ack==1 &&
ack_seq==2001&&
seq == 1001)
{return OK;}
這三向交握:
第一次就是c發包告訴s我要請求和你串連看行不?
第二次就是s收到包後看到c想串連,顧客至上嘛!就給它回一個包,包中就是設定確認標誌,禮貌的等待c的確認!如果等待到期立刻中斷!
第三次就是c接到s的確認包,然後發送自己收到包的確認包告訴s可以串連,服務收到後確認後串連就完成!