TCP/IP协议

  TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

       TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓出港口实际表示接收能力,用以限制发送方的发送速度。

       如果TCP数据包有已经封好的TCP数据包,那么IP将把他们向“上”传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

       TCP将它的信息送到更高层的应用程序,例如Trelnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

       面向连接的服务(例如Telnet、Ftp、rlogin、X windows和SMTP)需要高度的可靠性,所以它们使用TCP。DNS在某些情况下使用TCP(发送和接受域名数据库),但是用UDP传送有关单个主机的信息。

1、TCP三次握手

TCP/IP协议

 

  TCP提供面向有连接的通信传输。面向有连接是指在数据同你新年开始之前先做好两端之间的准备工作。

       所谓三次握手是指建立一个TCP连接时需要客户端和服务端总共发送三个包以确认连接的建立。在socket编程中,这一过程有客户户端执行connect来触发。

       第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器端确认。

       第二次握手:服务器端收到数据包后由编制为SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置位1,ack=J+1,随机产生一个值seq=K,并将改数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

       第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置位1,ack=K+1,并将改数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。

2、 TCP的三粗握手的漏洞

  但是在TCP三次握手中有一个缺陷,就是如果我们利用三次握手的缺陷进行攻击。这个攻击就是SYN洪泛攻击。三次握手中有一个第二次握手,服务端向客户端应答请求,应答请求时需要客户端IP的,服务端是需要知道客户端IP的,攻击者就伪造这个IP,往服务器端狂发第一次握手的内容,当然第一次握手中的客户端IP地址是伪造的,从而服务端忙于进行第二次握手但是第二次握手当然没有结果,所以导致服务端被拖累,死机。

       面对这种攻击,有以下的解决方案,最好的方案是防火墙。

       无效连接监视释放

       这种方法不停监视所有的连接,包括三次握手的,还有握手一次的,反正是所有的,当达到一定阈值是拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,不管是正常还是工技大额,所以这种方式不推荐。

       延缓TCB分配方法

       一般做完第一次握手之后,服务器就需要为改请求分配一个TCB(连接控制资源),通常这个资源需要200多个字节。延迟TCB的分配,当正常连接建立起来后在分配TCB则可以有效地减轻服务器资源的消耗。

       使用防火墙

       防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起SYN请求

3、TCP四次挥手(分手)

  四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包确认连接的断开。在socket编程中,这一过程客户端或服务端任一方执行close来触发

       由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIIN来终止之一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上任然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgsx.html