0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

要是没有一端进行监听是否可以建立起TCP连接呢?

冬至子 来源:Linux码农 作者:Linux码农 2022-11-16 17:42 次阅读

在 TCP 网络通信过程中,我们都是先有 server 端调用 listen 监听某个端口号,然后 client 向 server 发起连接请求,最终建立起连接。

那么,要是没有一端进行监听,是否可以建立起 TCP 连接呢?

对于 TCP 来讲,一条链路的建立是通过三次握手来完成,而三次握手的过程是由内核完成的,显然三次握手应用程序是无法干扰的。

因此我们可能会想到使用原始套接字来接收 IP 报文,通过应用层来构造三次握手报文来完成三次握手的过程,但是该方法是行不通的,因为原始套接字在收到对端的回应报文 syn+ack 报文时,系统会自动给对端回应 RST 报文中断连接。 该现象原来的文章分析过,本文不在分析。若要实现套接字的三次握手成功,需要解决系统自动回应 RST 报文,比如通过 iptable 过滤掉 RST 报文。

在TCP的三次握手中,client 收到对端回应的 syn+ack 报文后,之所以能找到对应的套接口,是因为在 connect 时根据端口号把套接字加入到 tcp_hashinfo.ehash 的 hash 表中。而原始套接字会自动回复 RST 报文,就是没有在 hash 表中加入套接字,导致找不到套接字。

因此我们可以得到,只要避免找不到套接字就可以完成链路的建立。所以,两端同时打开套接字也可完成链路的建立,并不需要其中一端进行 listen。

同时连接

测试步骤就是2台机器各自绑定一个本地地址和端口号,然后同时向对端绑定的端口发送connect 请求,具体例子不再贴出。

在同时连接中,两端同时发送 SYN 报文而进入 SYN_SENT 状态;当每一端收到 SYN 后状态变为 SYN_RCVD, 发送 SYN 并对收到的 SYN 进行确认;当双方都收到对端的 SYN 及相应的 ACK, 状态变迁为 ESTABLISHED。状态变迁过程如下:

图片

以上是两端互相 connect 完成链路的建立,若要去掉两端,我们也可以实现connect 本端绑定的IP和端口号。

使用 nc 测试一个 自己连接自己的 TCP 连接

# nc 10.115.20.30 1234 -p 1234

# netstat -anp | grep 1234
tcp    0    0  10.115.20.30:1234  10.115.20.30:1234  ESTABLISHED 2050/nc

上述可以看到源端口号等于目的端口号,并且也完成链路的建立。

# strace nc 10.115.20.30 1234 -p 1234
execve("/usr/bin/nc", ["nc", "10.115.20.30", "1234", "-p", " 1234"], [/* 31 vars */]) = 0
brk(NULL)                               = 0x23d4000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f213f394000

...

munmap(0x7f213f393000, 4096)            = 0
open("/usr/share/ncat/ca-bundle.crt", O_RDONLY) = -1 ENOENT (No such file or directory)
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
//bind后直接就是connect,并没有进行listen
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("10.115.20.30")}, 16) = -1 EINPROGRESS (Operation now in progress)
select(4, [3], [3], [3], {10, 0})       = 1 (out [3], left {9, 999998})
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
select(4, [0 3], [], [], NULL

从跟踪结果来看,自己连接自己(公用同一个socket)完成了链路的建立。

自己连接自己只是同时连接中的一个特例。

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SYN
    SYN
    +关注

    关注

    0

    文章

    9

    浏览量

    8178
  • RST
    RST
    +关注

    关注

    0

    文章

    30

    浏览量

    7323
  • TCP通信
    +关注

    关注

    0

    文章

    144

    浏览量

    4138
收藏 人收藏

    评论

    相关推荐

    如何标识一个TCP连接

    tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp
    的头像 发表于 10-10 10:33 2400次阅读

    如何在while循环中持续TCP监听

    上位机监听时能读到次数据,第二次循环时发现监听又出现错误56,但我的小工具还在持续连接,不是很明白监听的原理?我该如何修改程序?有
    发表于 02-04 23:46

    Labview 同一端口如何监听花生壳里多个相同的域名?

    各位好: 请教下大伙。Labview 同一端如何监听花生壳里多个相同的域名? 比如: 1)电脑的IP是192.168.0.10,端口号是5010,在两台DTU设备中设置相同的花生壳域名及端口号 2
    发表于 12-26 09:43

    为什么lwip建立TCP客户时不动态分配本地端口?

    最近这两天,在做EtherNet/IP协议。STM32作为客户连接远程服务。现在遇到个问题,在建立
    发表于 08-29 20:48

    关于LabVIEW的TCP侦听VI的远程地址解析

    1、TCP侦听.VI 的远程地址解析为真时 TCP连接时 会发送以下命令 共会有三次 连接建立起
    发表于 09-28 19:54

    配置静态IP地址时,没有TCP连接可以建立,对ping没有响应

    新的,并且我正在尝试使用上面提到的具有集成PHY,25MHz的控制器来制造小型TCP服务器。外部OSC,没有外部的32 kHz OSC。我面临的几个问题是:1。当配置静态IP地址时,没有TCP
    发表于 11-04 07:03

    C语言和ASM语言是怎么建立起来的联系?

    = &Vout;在中断程序中,有下面的说明; publish Terminal Pointers for access from the C environment.def_ADCDRV_1ch_Rlt:n:C语言和ASM语言是怎么建立起来的联系?
    发表于 06-09 14:51

    BUCK电路的输出电压过程是如何建立起来的

    BUCK电路的输出电压过程是如何建立起来的?DCDC降压芯片有哪些功能?
    发表于 10-14 15:09

    如何建立VIRTUAL TERMINAL和COMPIM的连接

    首先需要在Proteus中将环境建立起来。我这里使用的版本是8.8.利用两个元器件就可以建立VIRTUAL TERMINAL和COMPIM的连接。如上图所示,两个VIRTUAL TER
    发表于 11-19 08:45

    怎样通过将两台笔记本电脑建立起串口连接

    本文通过将两台笔记本电脑,借助u***转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件将台笔记本上的个大文件传输到另外
    发表于 12-21 06:33

    CH32V307里的TCP协议栈可以同时创建TCP监听TCP连接吗?

    CH32V307里的TCP协议栈可以同时创建TCP监听TCP连接吗?
    发表于 09-29 09:54

    CH395作为TCP客户连接电脑TCP服务的时间很长怎么解决?

    CH395作为TCP客户,电脑作为TCP服务,第连接时很快就能
    发表于 10-14 06:09

    ESP-TCP有什么方法可以与域名服务器建立tcp连接

    :8591E (27839) example: Socket unable to connect: errno 113我的理解是这个例程只能够连接IP4/6 而不能够连接有域名的服务器 ,那请问有什么方法可以与域名服务器
    发表于 02-13 08:01

    没有accept,能建立TCP连接吗?

    服务端代码,对socket执行bind方法可以绑定监听端口,然后执行listen方法后,就会进入监听(LISTEN)状态。内核会为每一个处于LISTEN状态的socket 分配两个队列,分别叫半
    的头像 发表于 08-05 10:37 677次阅读

    TCP连接建立与中止

    常重要的 。 TCP 连接建立可以简单地称为三次握手,而连接的中止则可以称为四次挥手。
    的头像 发表于 10-08 16:52 455次阅读