理解tcp的三次握手

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值