TCP/IP实现以及常见问题

来源:互联网 发布:fanuc编程软件 编辑:程序博客网 时间:2024/06/06 12:55

三次握手连接建立

简单三次握手

其实看图会发现其实是很简单的一个过程

  • 首先,Client会发送一个SYN包,简单情况是SYN发送成功了,然后Client会把这个连接的Socket放入一个Socket等待队列,是Client这边维护的一个队列,,但是如果这里发送失败了,Server如果不给回复,它会按这个间隔去重新发送,3、6、12、24…重试十几次,会返回一个Connect Time out
  • 第二步,Server收到SYN包,然后把这个Socket放入Server这边维护的SYN队列,然后返回SYN+ACK报文,max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog)
  • 第三步Client收到Server发过来的ACK+SYN报文,相当于Client这边来看的话其和Server端的连接完成了,然后会返回一个ACK给Server
  • 第四步正常情况是ACK收到,然后Server端看来建立也连接成功,然后把Socket从维护的SYN队列放入到Accept队列,这样整个连接建立。但是有这样一种情况,Accept队列满了,它没办法加入到Accept,这时候的处理逻辑是按照这个参数来控制的,/proc/sys/net/ipv4/tcp_abort_on_overflow,如果这个参数是1的话,首先它会丢弃ACK,然后返回一个RST,这样的话就需要整个重新建立连接,Client会返回来一个Connection reset by peer。如果这个参数是0的话,那么Server这边会不处理这个ACK,直接丢弃,那么Clinet是怎么知道的呢,其实是在靠Read函数来确定的,Client在确定建立连接之后会紧接着发数据给Server,但是Server还没有建立连接,所以它会不理会,然后会一直重发,直到超时,这时候返回一个Read timeout

三次握手连接建立
1.首先Client需要两次交互就就能够确立连接了,但是Server需要三次才能确定建立连接
2。SYN flood攻击及其防护。

0 0
原创粉丝点击