一,引言
1.在http
超文本传输协议中,要完成客户端和服务端的请求和响应,第一步就是要让客户端和服务端建立可靠的连接,http
协议在传输层采用了tcp
连接。
二,tcp报文
1.要了解tcp
连接的过程我们首先要认识一下tcp
报文。
- 序号:
TCP
从进程接受数据字节时,就把它们存储在发送缓存中,并对每一个字节都进行编号,当字节都被编上号后,TCP
就给每个报文段指派一个序号,序号就是该报文段中第一个字节的编号。 - 确认号:对发送端的确认信息,用它来告诉发送端这个序号之前的数据段都已经收到,只有
ACK=1
时有效 - SYN : 同步序号位,
TCP
需要建立连接时将这个值设为1。 - ACK: 只有当
ACK=1
时,确认序列号字段才有效;当ACK=0
时,确认号字段无效。 - FIN: 发送端完成发送任务,当
TCP
完成数据传输需要断开连接时,提出断开连接一方将这个值设为1
三,tcp连接的过程–三次握手
2.三次握手图解:
(1) 首先由客户端发送SYN
报文,(设置SYN=1
,请求序列号seq=x
),此时客户端处于SYN_SEND
状态。
(2) 服务端接收到来自客户端的报文,发送ACK
报文,(设置ACK=1
,确认序列号为ack=x+1
(客户端发送的请求序列号+1))和自己的SYN
报文(设置SYN=1
,请求序列号seq=y
), 此时服务端处于SYN_REC
状态(半连接状态)
(3) 服务端接收到客户端的SYN
报文发送自己的确认报文(seq=x+1,ACK=1.ack=y+1)
此时客户端处于ESTABLISH
状态,当服务端接收到ACK
报文,连接建立。
3.需要三次握手的原因:某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,为了防止已失效的请求报文段突然又传送到了服务器端而产生连接的错误。导致服务端认为连接已经建立,一直等待客户端发送请求,浪费了网络资源。
4.SYN
攻击,降低半连接的等待时间。
三,tcp断开连接的过程–四次挥手
1.两端都可以发出终止连接请求,通常由客户端发出。
2.四次挥手图解:
(1) 由客户端发起终止连接请求,发送FIN
报文(seq=u,FIN=1)
进入FIN_WAIT1
状态。
(2) 服务端接收到FIN
报文,发送自己的ACK
报文(ACK=1,ack=u+1,seq=v)
,此时服务端处于CLOSE_WAIT
。由于此时服务端数据可能没有发送完,不会立即发送自己的FIN
报文,
(3)当客户端接收到ACK
报文,进入FIN_WAIT1
状态,等到服务端数据传输完毕,服务端发送自己的FIN+ACK
报文(FIN=1,ACK=1,seq=w.ack=u+1)
,此时服务端处于LAST_ACK
状态。
(4)客户端接收到FIN+ACK
报文之后,发送自己的ACK
报文(ACK=1,ack=w+1,seq=u+1)
,等待2MSL
断开连接
2.等待2MSL
的原因
确保客户端能接收服务端重发的ACK+FIN
报文,从而保证了服务端能接收到ACK
报文。
四,tcp优缺点分析
1.优点:可靠,稳定:
TCP
的可靠体现在TCP
在传输数据之前会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
2.缺点:慢,效率低,占用资源高,易被攻击:
TCP
在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制,重传机制,拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接。事实上每个连接都会占用系统的CPU
、内存等硬件资源。
因为TCP
有确认机制、三次握手机制,这些优点在成了缺陷,导致TCP
容易被人利用,实现DOS
、DDOS
、CC
、猜测攻击等