没有 accept,建立 TCP 连接,可以吗?

TCP连接通常涉及listen和accept方法,但实际上TCP连接的建立并不依赖accept。本文通过分析三次握手过程,揭示了即使没有执行accept,服务端仍能与客户端建立连接。全连接队列和半连接队列在此过程中起到关键作用,而半连接队列采用哈希表提高查找效率。当队列满时,服务端可能会丢弃连接,或者启用tcp_syncookies应对SYN Flood攻击。客户端可以通过自连接或TCP同时打开实现连接,即使没有listen方法。
摘要由CSDN通过智能技术生成

正文

下面这个动图,是我们平时客户端和服务端建立连接时的代码流程。

8c198c3a745bdf1038abb819e91c0eb7.jpeg握手建立连接流程

对应的是下面一段简化过的服务端伪代码。

int main()
{
     /*Step 1: 创建服务器端监听socket描述符listen_fd*/    
    listen_fd = socket(AF_INET, SOCK_STREAM,  0);

     /*Step 2: bind绑定服务器端的IP和端口,所有客户端都向这个IP和端口发送和请求数据*/    
    bind(listen_fd, xxx);

     /*Step 3: 服务端开启监听*/    
    listen(listen_fd,  128);

     /*Step 4: 服务器等待客户端的链接,返回值cfd为客户端的socket描述符*/    
    cfd = accept(listen_fd, xxx);

       /*Step 5: 读取客户端发来的数据*/
      n = read(cfd, buf,  sizeof(buf));
}

估计大家也是老熟悉这段伪代码了。

需要注意的是,在执行listen()方法之后还会执行一个accept()方法。

一般情况下,如果启动服务器,会发现最后程序会阻塞在accept()里。

此时服务端就算ok了,就等客户端了。

那么,再看下简化过的客户端伪代码。

int main()
{
     /*Step 1: 创建客户端端socket描述符cfd*/    
    cfd = socket(AF_INET, SOCK_STREAM,  0);

     /*Step 2: connect方法,对服务器端的IP和端口号发起连接*/    
    ret = connect(cfd, xxxx);

     /*Step 4: 向服务器端写数据*/
    write(cfd, buf,  strlen(buf));
}

客户端比较简单,创建好socket之后,直接就发起connect方法。

此时回到服务端,会发现之前一直阻塞的accept方法,返回结果了

这就算两端成功建立好了一条连接。之后就可以愉快的进行读写操作了。

那么,我们今天的问题是,如果没有这个accept方法,TCP连接还能建立起来吗?<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值