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

    浏览量

    8195
  • RST
    RST
    +关注

    关注

    0

    文章

    31

    浏览量

    7381
  • TCP通信
    +关注

    关注

    0

    文章

    146

    浏览量

    4215
收藏 人收藏

    评论

    相关推荐

    如何标识TCP连接

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

    进行开环分析时,Aol(开环增益)曲线与1/β(噪声增益)曲线的交点频率如何用等式建立起来?

    如上图电路所示,在进行开环分析时,Aol(开环增益)曲线与1/β(噪声增益)曲线的交点频率如何用等式建立起来?
    发表于 08-15 08:17

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

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

    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

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

    本文通过将两台笔记本电脑,借助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

    大神告诉你TCP建立连接为什么是三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立TCP
    的头像 发表于 04-16 11:43 1w次阅读
    大神告诉你<b class='flag-5'>TCP</b><b class='flag-5'>建立</b><b class='flag-5'>连接</b>为什么是三次握手

    如何使用TCP连接HTTP详细资料说明

    到可能运行在世界任何地方的服务器应用程序。连接建立起来了,在客户 和服务器的计算机之间交换的报文就永远不会丢失、受损或失序。
    的头像 发表于 04-06 14:05 4123次阅读
    如何使用<b class='flag-5'>TCP</b><b class='flag-5'>连接</b>HTTP详细资料说明

    新华三与海信合作建立起道守护数据和应用安全的“生命线

    为此,海信在转型路上选择与紫光股份旗下新华三合作。通过细致的调研、深厚的知识储备和全生命周期的服务能力,新华三携手海信构建起了个更加高效可靠的容灾体系,打赢了场业务连续性“保卫战”,建立起
    的头像 发表于 06-23 10:13 1378次阅读

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

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

    ESP8266模组的TCP编程

    TCP 编程分为客户和服务器两个部分,其中服务器首先建立起 socket,然后与本地端口进行
    的头像 发表于 04-24 11:02 1071次阅读
    ESP8266模组的<b class='flag-5'>TCP</b>编程

    TCP连接建立与中止

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

    TCP连接建立中的异常

        建连接时SYN超时问题 如果 server 因为某种情况没有收到 client 回来的 ACK,那么,这个连接处还处于个未
    的头像 发表于 10-08 17:01 764次阅读