TCP

三次握手

TCP如何保证可靠传输

  • 数据报校验
  • 超时重传机制
  • 应答机制
  • 对失序数据包重排序
  • TPC还能提供流量控制

三次握手

image

三次握手过程

  • 第一次握手:client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认。
  • 第二次握手:server收到数据包后由标志位SYN=1知道client请求连接,server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值sep=K,并将该数据包发送给client以确认连接请求,server进入SYN_RCVD状态。
  • 第三次握手:client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则连接建立成功,client和server进入established状态,完成三次握手,随后client和server之间可以开始传输数据了。

三次握手原因

  为了防止失效的链接请求报文突然又传到了服务端,因而产生错误。例如:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文并没有丢失,而是在某个网络节点长时间滞留,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。当server却以为新的运输连接已经建立,并一直等待client发来数据。这样,sever的很多资源就白白浪费了。采用三次握手可以防止上述现象的发生。例如刚才那种情况,client不会向server发出确认。server由于收不到确认,就知道client并没有要求建立连接。

  通过三次握手可以确认客户端和服务器端的收发功能是否正常。client确认了:自己发送、接收正常,对方发送、接收正常;server确认了:自己发送、接收正常,对方发送、接收正常。

DDos攻击

  client不断向sever发送请求,server会给每个请求创建一个连接,然后向client发送创建链接时的回复,然后进行等待客户端发送第三次握手数据包。DDos攻击就是这样的原理,第一个D表示的是分布式distribute。让server产生大量的等待client回复的连接,浪费系统资源,并且会使正常的请求进不来。

  简单说服务器发送连接请求,首先:

  1. 客户端向服务器端发送连接请求的数据包(第一次握手)。
  2. 服务器向客户端回复连接请求数据包(第二次握手)。然后服务器等待客户端发送tcp/ip连接的第三步数据包(第三次握手)。
  3. 如果客户端不向服务器端发送最后一个数据包,则服务器必须等待30s-2min才能将此连接关闭。当大量的请求只进行到了第二步,而不进行第三步,服务器又有大量资源在等待第三个数据包。最后就造成了DDos攻击。

预防ddos攻击(没有根治办法,除非不用tcp/ip)

  • 确保服务器的系统文件是最新版本,并及时更新系统补丁
  • 关闭不必要的服务
  • 限制同时打开SYN的半连接数目
  • 缩短SYN半连接的time out时间
  • 正确设置防火墙
  • 禁止对主机的非开放服务访问
  • 限制特点IP短地址的访问
  • 启用防火墙防DDos的属性
  • 严格限制对外开放的服务器的向外扫描
  • 运行端口映射程序或端口扫描程序,要认真检查特权端口和非特权端口。
  • 认真检查网络设备和主机/服务器系统的日志。只要日志出现漏洞或是时间变更,那这台机器就可能遭到了攻击。
  • 限制在防火墙外与网络文件共享,这样会给黑客截取系统文件的机会,主机的信息会暴露给黑客,无意给了对方入侵的机会。

四次挥手

image

四次挥手过程

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

  • 第一次挥手:client发送一个FIN,用来关闭client到server的数据发送,client进入FIN_WAIT_1状态。
  • 第二次挥手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号,server进入CLOSE_WAIT)。
  • 第三次挥手:server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态。
  • 第四次挥手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSED状态,完成四次挥手。

四次挥手的原因

  TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

为什么建立连接是三次握手,而关闭连接却是四次挥手

  这是因为服务器端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN报文时,仅仅表示对方不在发送数据了但是还能接受数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

TCP和UDP

  • UDP是无连接的,即发送数据之前不需要建立连接。
  • UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
  • UDP是面向报文的,UDP没有拥塞控制,很合适多媒体通信的要求。
  • UDP支持一对一,一对多,多对一和多对多的交互通信。
  • UDP的首部开销小,只有8个字节。
  • TCP是面向连接的运输层协议。每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。
  • TCP提供可靠交付的服务。
  • TCP提供全双工通信。
  • TCP面向字节流。
  • 首部最低20个字节。

参考: