全连接队列和半连接队列

半连接队列

syn-cookie打开的情况下

服务器接收到第一次握手的消息后,不会立刻将相关信息放进半连接队列,而是根据对面发过来的报文计算自己的SYN初始序列号。

利用下面几个部分:

  • 客户端IP、客户端端口号、服务端IP、服务端端口号,这4个部分计算一个哈希值
  • 一个缓慢增长的时间戳t
  • 客户端发来的SYN序列号
  • 客户端发来的MSS协商值

利用这4个部分计算一个序列号,作为服务端的初始序列号,发送给客户端。

从客户端收到第三次握手的信息,先提取它的ACK序列号,然后减1,就应该是服务端计算出来的初始序列号。然后解码出上面提到的4个部分,如果IP地址和端口号的四元数是匹配的,客户端第一次握手的SYN序列号和MSS都是匹配的,而时间戳t的差值在接收范围内,那么就直接将这个连接的信息放进全连接队列中。

在这种情况下,半连接队列不会发生溢出,相当于容量是无限大的。

syn-cookie没有打开

半连接队列的容量的计算方法是max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)

SYN_RECV状态

被放置在半连接队列中的连接处于SYN_RECV状态。

全连接队列

ESTABLISHED状态

处于全连接队列中的连接属于ESTABLISHED状态。

listen函数

listen函数用来建立半连接队列和全连接队列。

#include<sys/socket.h>
int listen(int sockfd, int backlog);

listen函数的第二个参数确定了半连接队列和全连接队列的长度的和。

accpet函数

对于服务器,没有任何api控制三次握手。在listen建立好两个队列后,往半连接队列插入、从半连接队列取出放进全连接队列,这些操作都是内核自动完成的。

accept函数的功能仅仅是从全连接队列中取出一个已经完成三次握手的连接

队列溢出

如果两个队列中的任意一个发生了溢出,就会直接向客户端返回一个rst。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值