三次握手
第一次握手:主机A发送位码为syn=1,随机产生seq number=x的数据包到服务器,客户端进入SYN_SEND状态,等待服务器的确认;主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number(主机A的seq+1),syn=1,ack=1,随机产生seq=y的包,此时服务器进入SYN_RECV状态;
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
tcp的报文格式
报文中的重要字段
序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
URG:紧急指针(urgent pointer)有效
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
SYN:发起一个新连接
FIN:释放一个连接
实例分析
用wireshark抓包,然后分析,下面已将三次握手的包取出
第一次握手
客户端向服务端发送SYN报文
第一次握手发送的状态为syn的报文,seq =0。在某个主机开启一个tcp会话时,它的初始序列号是随机的,可能是0 和 4,294,967,295之间的任意值,然而,wireshark中,通常显示的都是相对序列号/确认号,而不是实际的序列号/确认号。
查看相对序列号/确认号的真实值。
edit → preferences → protocols → TCP,去掉Relative sequence number前面的勾。
第二次握手
服务端接收到客户端的syn报文,回复syn+ ack报文
第三次握手
客户端接收到服务端发送的syn+ack包,回复ack包
图表分析