TCP三次握手
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP作为可靠的协议,其可靠性依赖的就是ACK确认。A向B发送了一个TCP报文,B便要回复一个ACK确认,当A向B发送的数据包丢失时或B向A发送的ACK丢失,发送方在超时时间内未收到对方发来的ACK,发送方会一直周期性的重传数据包,直到收到ACK为止、或者达到重传上限重新建立TCP链接。
建立连接、数据传输、断开链接需要ACK确认。
RST报文、裸ACK报文不需要ACK确认
RST报文不需要ACK确认主机A发送完RST报文之后,操作系统会将和该TCP链接有关的内存全部释放。 若B收到了RST报文,也会释放相关内存。 若B未收到RST报文,可能会继续发送让接收方弹射出Reset报文的报文,到最后对方一样会收到重置报文,并最终释放内存。
ACK报文不需要ACK确认 收到没有携带任何数据的ACK报文不需要返回确认,否则会产生死循环。
数据包的组装由操作系统完成,组装完毕后交由报文中的目标端口,监听该端口的进程提取数据。
TCP四次挥手