成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如果沒有 listen,能否建立 TCP 連接?

網絡 通信技術
在 TCP 網絡通信過程中,我們都是先有 server 端調用 listen 監聽某個端口號,然后 client 向 server 發起連接請求,最終建立起連接。

在 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)完成了鏈路的建立。

自己連接自己只是同時連接中的一個特例。

責任編輯:華軒 來源: 今日頭條
相關推薦

2020-10-14 14:31:37

LinuxTCP連接

2015-10-09 13:15:03

TCP網絡協議

2015-03-25 12:09:18

TCP網絡協議TCP建立連接

2021-03-17 09:51:31

網絡編程TCP網絡協議

2011-06-03 16:41:35

webOS惠普

2014-12-31 10:02:14

Android可穿戴設備世界

2015-01-05 10:26:14

Android手機廠商

2010-06-23 15:19:35

eMule協議

2021-11-04 09:49:55

智能自動駕駛汽車

2010-07-01 16:38:18

Linux TCP I

2011-08-24 16:16:07

LISTEN中文man

2011-08-25 14:16:51

listen中文man

2019-07-19 06:58:03

TCP三次握手網絡協議

2015-04-23 18:46:38

TCPTCP協議

2021-04-20 10:21:13

機器學習數據算法

2010-01-06 10:04:55

2019-09-16 09:29:01

TCP全連接隊列半連接隊列

2010-06-13 15:37:24

TCP協議

2021-02-18 22:18:50

TCP 服務器源碼

2010-07-07 10:45:22

TCP UDP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本一区二区不卡视频 | 久久国产精品视频 | 亚洲看片网站 | 亚洲一区二区在线播放 | 91麻豆产精品久久久久久夏晴子 | 日韩三区 | 色婷婷av久久久久久久 | 亚洲精品视频在线观看免费 | 999视频在线播放 | 少妇诱惑av | 精品久久一区 | 91福利网| 精久久久| 欧美一区二区三区免费在线观看 | a精品视频 | 午夜精品一区二区三区在线视频 | 亚洲一区日韩 | www.99热.com| 在线一区 | 亚洲精品久久久久中文字幕欢迎你 | 在线免费黄色小视频 | 亚洲欧美中文字幕在线观看 | 日韩av成人在线观看 | 91电影 | 日韩高清中文字幕 | 天堂资源 | 国产精品久久久久久久免费大片 | 成人一区二| www.国产精品 | 99热首页| 亚洲精品一二三 | 久久久国产一区二区三区 | 欧美美乳 | 免费人成在线观看网站 | 亚洲成人午夜电影 | av网站免费观看 | 激情五月综合 | 久久激情视频 | 精品国产一区一区二区三亚瑟 | 91精品国产乱码久久久久久久久 | 久久久久国产一区二区三区四区 |