如果 TCP 协议中三次握手不携带序列号,会造成什么样的后果

之所以需要三次握手,其实就是要双方相互确认彼此能够通信。
一般要与对方确认可以通信,就要确认自己能够跟对方通信(1),且能够收到对方的通信(2),反过来对方也能够和自己通信(3),且能收到自己的通信(4)。基于这一点,流程就简化为3次握手通信。
首先,client发送一个SYN=1,seq=X(X随机)到server,server收到这个消息,则确认了client能够与server通信这件事(1),这时,server将SYN=1,ACK=1,ack=X+1,seq=Y(Y随机)发送给client;client收到这个消息,则确认了client能够收到对方的通信(2)和server能够与client通信这件事(3),最后client发送ack=Y+1,ACK=1返回给server,server收到后,确认了server能够收到client的通信这件事(4)。至此,双方的通信确认过程完成且建立了连接。(总结上面的发送信息,简单的说就是:SYN:表示一个想要连接对方的请求;ACK、ack表示一个答复对方连接请求的响应;中间随机数seq:请求连接的信物)
这里的三次握手重点每一次都有关联,seq随机一个数发送给对方,对方收到后用ack=seq+1的方式表示针对上一个通信的准确回复。如果不用序列号的话,client在最后一步的发送中可以发送任意数据给server,确认最后的连接过程且最终建立连接。由于client可以随意伪造任意多的ip,那么最终server建立了很多不存在且无用的TCP连接。
但是这个机制同样存在一个问题,就是SYN攻击。client伪造大量随机ip,向server发送SYN=1,seq=X的第一步的连接请求,server给不存在的ip发送SYN=1,ACK=1,ack=X+1,seq=Y响应,由于client的ip不是实际存在的,所以server发出的消息不能到达,server不断的重试直到超时,那么server的连接队列会被占满,正常的TCP握手请求就无法到达server,影响了正常的连接请求,导致网络阻塞或者server系统瘫痪。
这种SYN攻击通过命令netstat -nap | grep SYN_RECV可以查出来.

你可能感兴趣的:(网络编程)