为帮助大家理解connect,accept和close函数并使用netstat 调试TCP应用程序,我们必须了解如何建立和终止TCP连接以及TCP的状态转换图.这是一个通过加深了解底层网络协议以帮助我们编写网络程序的例子。
模拟三路握手:
下述步骤建立一个TCP连接
1.服务器必须准备好接受外来的连接。通过调用socket,bind 和 listen函数来完成,称为被动打开(passive open)。
2.客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN分节(表示同步),它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据。它只含有一个IP头部,一个TCP头部及可能的TCP选项。
![](https://images2017.cnblogs.com/blog/1066153/201709/1066153-20170901105647827-461576902.png)
就是说 第一次握手 client端发送SYN报文, syn=1,SEQ也就是说序列号为 J---->4bytes,其他位置为0.
第二次握手 server端回复client端报文ACK报文 SYN=1,ACK=1,SEQ=Y,确认SEQ=J+1.
第三次握手 client端 SYN=1,SEQ=J+1,确认SEQ=Y+1。---->SEQ=第二次握手----> 确认SEQ---->第三次SEQ
=======================================================================================================
TCP机制的缺陷 DOS攻击缺陷,大量虚假IP的SYN报文攻击,服务器耗费大量的cpu与内存。
SYN攻击属于DDoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。
服务器接收到连接请求(syn= j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。
配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
3.服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它包含服务器将在同一个连接中发送的数据初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK。
4.客户必须确认服务器的SYN。
连接建立过程至少需要交换三个分节--->TCP的三路握手(three-way hand-shake)。我们在图2.2中展示这三个分节。
图2.2.给出的客户的初始序列号为J,而服务器的初始序列号为K。在ACK里确认号为发送这个ACK的一方所期待的对方的下一个序列号。因为SYN只占一个字节的序列号空间,所以每一个SYN的ACK中的确认号都是相应的初始序列号加1.类似的每一个FIN的ACK中的确认号为FIN的序列号加1.
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.