TCP/IP协议
TCP/IP协议是Internet最基本的协议、Internet国际互联网网络的基础,由网络层的IP协议和传输层的
TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新创数,直到所有数据安全的
传输到目的地。而IP是给Internet的每一台联网设备规定一个地址。
TCP协议的三次握手和四次挥手
seq:sequance 序列号 SYN:synchronize 请求同步标志 ACK:acknowledge 确认标志 FIN:Finally 结束标志
TCP最关键的三个步骤:三次握手,传输确认,四次挥手
三次握手是建立连接的过程:
第一次握手:A的TCP进程创建TCB(传输控制块),然后向B发出连接请求报文段。段首部中的 同步位
SYN=1,(SYN报文段不能携带数据,但需要消耗一个序列号)同时选择一个初始序列号seq=x; 这是客户端进入到SYN-SENT(同步已发送)状态
第二次握手:B收到请求连接的报文段,如果同意建立连接,则向A发送确认。在确认报文段中 同步位
SYN=1,确认位ACK=1,确认号ack=x+1(对接受的序列号seq=x的报文段进行确认,并期望接收的下一个报文段的序号seq=x+1)
同时也为自己选择一个初始序列号seq=y,这是服务器进入SYN_RCVID状态
第三次握手:A收到B的确认后,再向B发出确认。确认ACK=1、确认号ack=y+1(对接受的序列号seq=y的报文段进行确认,并期望
接收的下一个报文段的序号seq=y+1)。这是A进入到ESTAB-LISHED状态。当B接受到A的确认后,也进入ESTAB-LISHED状态。连接建立完成。
同步位SYN:在建立连接时用来同步序号;当SYN=1,ACK=0时,表明这是一个连接请求报文段。当SYN=1,ACK=1时,表明这是一个连接接收报文段;
确认位ACK:当ACK=1时,确认号ack才生效。在请求建立连接后(第一次握手后),所有的报文段都必须把ACK置1。
确认号ack:期望收到的下一个报文段的第一个数据字节的序号,比如:B正确接收到了A发送过来的一个报文段,序号是501,数据长度是200字节;这表明B正确接收到了序号501-700的数据。所以,B期望的下一个序号是701,于是B在发送给A的确认报文段中确认号ack=701。
CLOSED:初始关闭状态
LISTEN:监听状态,等待客户连接
SYB-SENT:同步已发送
SYN-RCVD:同步已接收
ESTAB-LISHED:已建立连接
为什么不是两次握手?
这主要是为了防止已失效的请求报文,突然又传到服务器引起错误。
假设采用两次握手建立连接,客户端向服务端发送一个SYN包来请求建立连接,因为某些未知的原因,并没有到达服务器,
为了建立连接客户端会重发SYN包,这次数据包正常送达,服务段回复SYN+ACK之后建立起了连接,但是第一包数据阻塞的
节点突然恢复,第一包SYN包又送达到服务器,这时服务器会误认为是客户端又发起了一个新的连接,服务端认为是两个连接
而客户端认为是一个连接,造成了状态不一致,如果在三次握手情况下,服务端收不到ACK包,自然不会认为连接成功,所以三次握手
本质上来说就是为了解决网络信道不可靠的问题。
四次挥手
A与B想要断开连接,需要经过四次挥手
第一次挥手:A先发送连接释放报文段,段首部的终止控制符FIN=1,序号seq=u(等于A前面发送数据的最后一个序号加1);然后A进入
FIN-WAIT-1(终止等待1)状态,等待B确认。
注意:FIN报文段即使不携带数据也要消耗一个序列
第二次挥手:B收到A的释放连接后,立刻发出确认报文段,确认号ack=u+1,序号seq=v(等于B前面发送数据的最后一个序号1)然后B进入
ClOSE-WAIT(关闭状态)
注意:TCP服务器这时会通知高层应用进程,从A到B这个方向的连接就断开了,这时TCP连接处于半关闭状态(half-close);但B到A这个方向
的连接并没有断,B仍然可以向A发送数据。
第三次挥手:A收到B的确认报文段后进入到FIN-WAIT-2(终止等待2)状态,继续等待B发出连接释放报文段;若B已经没有数据要发送,B就会向
A发送连接释放报文段,段首部的终止控制为FIN=1,序列号seq=w(半关闭状态可能又发送了一些数据),确认号ack=u+1,这是B进入LAST-ACK
(最后确认)状态,等待A的确认。
特别注意:确认号ack没有变,仍然为上次发送过的确认号u+1
第四次挥手:A收到B的连接释放报文段并发出确认,确认段中 确认位ACK=1,确认号ack=w+1,序列号seq=u+1;然后A进入到
TIME-WAIT(时间等待)状态。当B再接受到该确认段后,B就处于CLOSED状态。
四挥的七个状态:
ESRAB-LISHED:已建立连接
FIN-WAIT-1:终止等待1
CLOSE-WAIT:关闭等待
FIN-WAIT-2::终止等待2
LAST-ACK:最后确认
TIME-WAIT:时间等待
CLOSED:关闭
为什么客户端需要等待超时时间:
这书为了保证对方已经收到ACK包,因为假设客户端发送最后一包ACK后就释放了连接,一旦ACK包在网络中丢失服务端
将一直停留在最后确认状态。
如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包
重发ACK包并刷新超时时间。
这个机制跟三次握手一样,也是为了保证在不可靠数据链路中进行可靠的连接断开确认。