TCP基础知识
TCP是面向连接的,安全可靠,面向字节流,传输效率低,传输速度慢,是一个全双工性,具有流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)。发送数据需要与目标主机建立连接。
UDP:面向无连接的,具有不可靠性,是面向报文,传输效率快,传输速率快,属于一对一、一对多、多对一、多对多,无流量控制、拥塞控制。发送数据不需要建立连接。
三次握手:
第一次握手:客户端将TCP报文标识位SYN置为1,随机产生一个序号值为seq=x,保存在TCP首部的序列号字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标识位SYN=1知道客户端请求建立连接,服务器端将TCP报文标识位SYN和ACK都置为1,ack=x+1,随机产生一个序号值seq=y,并将数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户机收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标识位ACK置为1,ack=y+1,将该数据包发送给服务端,服务端检查ack是否为y+1,ACK是否为1,如果正确则建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手。
注:ack代表头部的确认号,是对上一个包的序号进行确认的号,ack=seq+1。
大ACK 则是TCP首部的标识位,用于标识TCP包是否对上一个包进行了确认,如果确认,则把ACK标识位置为1.
四次挥手:
第一次挥手:客户机主动调用close报文,向服务器发送一个FIIN终止报文,FIN报文置为1,并产生一个随机数u;
第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接受
第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态
第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。