TCP
TCP是一种面向连接的、基于字节流的传输层通信协议。TCP协议采用三次握手建立一个连接,采用四次挥手断开连接。TCP特点:保证可靠性,同时尽可能提高性能
建立连接的过程
三次握手

第一次
客户端给服务端发一个 SYN 报文,并指明自己的初始化序列号 seq = x。此时客户端处于 SYN_SENT(同步已发送) 状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序列号。
第二次
服务器收到客户端的 SYN 报文之后,如果同意连接,则发出确认 ACK 报文。确认序列号是 ack = x+1 ,并且也要指明自己的初始化序列号 seq = y 。表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD(同步收到) 的状态。这个报文也不能携带数据,但是同样要消耗一个序列号。
第三次:
客户端收到服务端的确认后,还会向服务器发出确认 ACK 报文。确认序列号为第二次握手服务器的序列号 y+1 ,同时自己的序列号是 x+1 。发送完成后,客户端进入**ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED(已建立连接)**状态,双方就可以开始通信了。
为什么需要三次
- 第一次可以知道客户端的发送能力、服务端的接收能力是正常的。
- 第二次可以知道服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
- 第三次可以知道客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
半连接队列和全连接队列
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
SYN攻击(洪泛攻击)
SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务器不断地发送SYN包(也就是第一次握手),服务端则回复确认包(第二次握手,服务端也是在这个时候分配了TCP空间),并等待客户端确认,由于源地址不存在,因此服务端需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防御手段:1.SYN Cache:不急于分配TCP空间,先保存起来并且相应客户端,直到接收了客户端的第三次握手相应后再分配TCP空间。2.SYN Cookie:使用特殊的算法验证,验证通过才为连接创建TCP空间。3.SYN Proxy防火墙:在客户端发送SYN包时进行一次拦截,确认连接的有效性后才放行发给服务器。如下图:

断开连接的过程
四次挥手

第一次
客户端发出连接释放 FIN 报文,其序列号为 seq = u ,并停止再发送数据,主动关闭TCP连接,进入**FIN-WAIT-1(释放等待1)**状态,等待服务端的确认。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次
服务端收到连接释放报文段后即发出确认 ACK 报文,确认序号为 u+1,并且带上自己的序号 seq=v ,服务端进入**CLOSE-WAIT(关闭等待)状态。客户端收到服务端的确认后,进入FIN-WAIT-2(释放等待2)**状态。此时的TCP处于半关闭状态,即客户端已经没有数据要发送了。但是服务器若发送数据,客户端依然要接受。
第三次
服务器发送完所有数据后,最后发出连接释放 FIN 报文,序号为w,确认序列号为 v+1 ,服务端进入**LAST-ACK(最后确认)**状态,等待客户端的确认。
第四次
客户端收到服务端的连接释放报文段后,对此发出确认 ACK 报文,序号为 w+1,自己的序号为 u+1,客户端进入**TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过2∗MSL(Maximum Segment Lifetime:最长报文段寿命)的时间后,客户端才进入CLOSED(关闭)状态。服务端收到客户端的确认报文段后,立即进入CLOSED(关闭)**状态。
为什么建立连接是三次握手,关闭连接是四次挥手
- 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
- 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
6万+



被折叠的 条评论
为什么被折叠?



