第一部分 TCP/IP 三次握手原理
1、TCP/IP三次握手示意图
SYN:同步序号。
ACK:应答回复。
RST:复位连接,清除旧有的同步序号。
PSH:尽可能的将数据送往接收进程。
FIN:发送方完成数据发送。
LISTEN:监听是否有连接请求包。
SYN_RECV:该状态处于向发送连接请求方回应我已经收到了你的连接请求阶段。
SYN_SEND:该状态处于已发出连接请求包,等待对方回应阶段。
ESTABLISHED:建立连接状态
2、三次握手步骤
1)第一次握手
客户端向服务器端发送连接请求包SYN(syn=j),等待服务器回应。
2)第二次握手
服务器端收到客户端连接请求包SYN(syn=j)后,将客户端的请求包SYN(syn=j)放入到自己的未连接队列,此时服务器需要发送两个包给客户端。
①向客户端发送确认自己已收到其连接请求的确认包ACK(ack=j+1),并向客户端表明已知道了其连接请求为j。
②向客户端发送连接询问请求包SYN(syn=k),询问客户端是否已经准备好建立连接,可进行数据通信;即在第二次握手时服务器向客户端发送ACK(ack=j+1)和SYN(syn=k)包,此时服务器进入SYN_RECV状态。
3)第三次握手
①客户端收到服务器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服务器同意建立连接,此时需要发送连接已建立的消息给服务器。
②向服务器发送连接建立的确认包ACK(ack=k+1),回应服务器的SYN(syn=k)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
③ACK(ack=k+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。
第二部分 为什么不能只两次握手?
1、三次握手的目的:
消除旧有连接请求的SYN消息对新连接的干扰,同步连接双方的序列号和确认号并交换TCP窗口大小信息。
2、两次握手的危害。
根据三次握手的描述,当第二次握手时,服务器向客户端发送ACK包后,客户端立即建立连接,而不通知服务器我已经开始传输数据。当出现网络阻塞时,因TCP/IP协议具有定时重传机制功能(即请求方向对方发送SYN请求后在规定的时间内未得到回应,会再次发出请求),会出现数据出错现象。例子如下。
举例:
主机A向主机B发送连接请求。
1)主机A向主机B发送SYN连接请求包,若干时间后,B未收到,A再次发送一次,即共发了2次,分别对报文命名为x,y。(这2份请求因阻塞原因,他们的TCP窗口大小和数据报文长度不一致,即是有区别的)
2)假设主机B收到的是请求x, y未收到。那么B就会同A成功建立X连接。由于A发了2次连接请求报文,而这个时候却已经成功建立了连接,可以传输数据。B又不告诉A连接的是x,还是y,若A采取就近原则,建立连接y,那么B处理数据时将出现问题。
第三部分 TCP/IP四次挥手原理
1、TCP/IP四次挥手示意图
FIN:关闭连接请求。
ACK:应答回复共收到多少数据。
2、为何需要四次挥手
TCP成功建立连接时,使用的是全双工模式(即数据在两个方向上能同时传递),因此每个方向必须单独进行关闭,且双方确认所收到的包大小与发出的包大小一致。
3、作用
保证服务器与客户端都能完全的接受对方发送的数据,保证数据的完整性。
4、四次挥手步骤讲解
假设客户机A向服务器B请求释放TCP/IP连接
1)第一次挥手
客户机A向服务器B发送FIN包;A告诉B,发给你的数据大小是N,发送完毕,请断开A到B的连接。
2)第二次挥手
服务器B收到了客户机A发送的FIN包,需要向客户机A发送ACK包,告诉A实际收到的数据大小是 不是N,若是则关闭A到B的连接。
3)第三次挥手
服务器B向客户机A发送FIN包,B告诉A,我发给你的数据大小是M,我发送完毕,请求断开B到A的连接。
4)第四次挥手
客户机A收到了服务器B发送的FIN包,并发送ACK包告知其收到的数据大小是M,并关闭B到A的连接。