TCP三次握手原理:
首先,给张图片,建立TCP三次握手的直观印象。
每次握手(发送数据请求或应答)时,发送的数据为TCP报文,TCP段包含了源/目的
地址,端口号,初始序号,滑动窗口大小,窗口 扩大因子,最大报文段长度等。还有
一些标志位:
(1)SYN:同步序号
(2)ACK:应答回复
(3)RST:复位连接,消除旧有的同步序号
(4)PSH:尽可能的将数据送往接收进程
(5)FIN:发送方完成数据发送
(6)URG
从图中,可以看出三次握手的基本步骤是:
第一次握手:客户端向服务器端发送连接请求包SYN(syn=j),等待服务器回应;
第二次握手:服务器端收到客户端连接请求包SYN(syn=j)后,将客户端的请求包
SYN(syn=j)放入到自己的未连接队列,此时服务器需要发送两个包给客户端;
(1)向客户端发送确认自己收到其连接请求的确认包ACK(ack=j+1),向客户
端表明已知道了其连接请求
(2)向客户端发送连接询问请求包SYN(syn=k),询问客户端是否已经准备好
建立连接,进行数据通信;
即在第二次握手时服务器向客户端发送ACK(ack=j+1)和SYN(syn=k)包,此
时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服
务器同意建立连接,此时需要发送连接已建立的消息给服务器;
向服务器发送连接建立的确认包ACK(ack=k+1),回应服务器的SYN(syn=k)
告诉服务器,我们之间已经建立了连接,可以进行数据通信。
ACK(ack=k+1)包发送完毕,服务器收到后,此时服务器与客户端进入
ESTABLISHED状态,开始进行数据传送。
为什么不能只两次握手?
有了三次握手的详细步骤,就可以分析为什么需要三次握手而不是两次握手了。
三次握手的目的:消除旧有连接请求的SYN消息对新连接的干扰,同步连接双方的序
列号和确认号并交换TCP 窗口大小信息。
设想:如果只有两次握手,那么第二次握手后服务器只向客户端发送ACK包,此时客
户端与服务器端建立连接。在这种握手规则下:
假设:如果发送网络阻塞,由于TCP/IP协议定时重传机制,B向A发送了两次SYN请
求,分别是x1和x2,且因为阻塞原因,导致x1连接请求和x2连接请求的TCP窗口大小
和数据报文长度不一致,如果最终x1达到A,x2丢失,此时A同B建立了x1的连接,这
个时候,因为AB已经连接,B无法知道是请求x1还是请求x2同B连接,如果B默认是最
近的请求x2同A建立了连接,此时B开始向A发送数据,数据报文长度为x2定义的长
度,窗口大小为x2定义的大小,而A建立的连接是x1,其数据包长度大小为x1,TCP窗
口大小为x1定义,这就会导致A处理数据时出错。
很显然,如果A接收到B的请求后,A向B发送SYN请求y3(y3的窗口大小和数据报长
度等信息为x1所定义),确认了连接建立的窗口大小和数据报长度为x1所定义,A再次
确认回答建立x1连接,然后开始相互传送数据,那么就不会导致数据处理出错了。
question:
TCP三次握手机制中的seq和ack的值到底是什么意思? TCP连接的三次握手: 第一次(A---B),SYN=1,seq=x 第二次(B---A),SYN=1,ACK=1,seq=y,ack=x+1 //seq为什么是y,ack为什么是x+1? 第三次(A---B),ACK=1,seq=x+1,ack=y+1 //seq为什么是x+1,ack为什么是y+1? 一直没搞懂,谁能解释详细点。
answer: