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可以连接,服务收到后确认后连接就完成!