(十四)连接:三次握手

用到的TCP报文段中字段

序列号(seq):表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始。

确认号(ack):表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。也就是告诉发送方:我希望你(指发送方)下次发送给我的TCP报文段的序列号字段的值是这个确认号。(TCP捎带确认机制)

ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1。

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1

第一次握手 
客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1seq=x。请求发送后,客户端便进入SYN-SENT状态。

PS1:SYN=1表示该报文段为连接请求报文。

第二次握手 
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
该应答发送完成后便进入SYN-RCVD状态。

PS1:SYN=1表示该报文段为连接同意的应答报文。

第三次握手 
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
该报文段的头部为:ACK=1,seq=x+1(已经包含客户端发往服务端数据),ack=y+1。
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

TCP为什么不是2次握手?

TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。

为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次握手(若是2次,不一定保证客户端能接收到服务端的序号)。(三次握手握的是通信双方数据约定的序列号)

 为什么不采用4次握手: 

①握手握的是序列号,四次握手的过程是:(1)A发送给B 同步序号SYN+A的seq为x;2,B收到后确认收到ACK发给A,然后令ack=x+1,确认A的seq按序到达;3,B向A发送SYN+自己的序列号seq为y;4, A收到B的序列号,存储到本地,发送ack=y+1,确认收到了,发送ACK+ack和自己的新序号seq为x+1。

②其中2(确认),3(发送服务端序列号)两步是完全可以归为一次发送的,所以不需要四次握手。

发布了547 篇原创文章 · 获赞 88 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/jiangshangchunjiezi/article/details/96102822