1.TCP包头结构如下
三次握手过程涉及的名词如下:
a.序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始
b.确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
c.ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
d.SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
2.建立握手过程图解
第一次捂手,客户端发起请求,这个时候SYN=1,其他位置0,表示要和服务端建立连接。还会随机发送一个序列号seq=x。客户端进入同步已发送状态(SYN_SEND)。
第二次捂手,服务器收到客户端的请求,看到SYN=1,知道要建立连接。客户端回复ACK=1确认和SYN=1,表示同意连接。并回复自己的序列号seq=y,和确认号ack x+1。服务端变成同步收到(SYN-RCVD)
第三次捂手,客户端收到,会检查ack是否为x+1和ACK是否为1,正确的话,回复ACK=1,ack=y+1,发送服务端,服务端会检查ack=y+1,ACK是不是为1,正确建立连接。双方变成已建立连接状态(ESTABLISHED)。