兩個進程使用同一個端口? (Two processes using the same port?)


問題描述

兩個進程使用同一個端口? (Two processes using the same port?)

So I was looking into what port dropbox uses on my computer and tried to see what would happen if i created a new http server on that port. Surprisingly it worked. So both dropbox and my http server were running on the same port, but the incoming requests were routed to the different application depending on the source address.

lsof ‑i tcp:51311

COMMAND  PID           USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

Dropbox 3811 user   18u  IPv4 0xdedc291239eb197f      0t0  TCP 172.20.10.2:51311‑>108.160.163.34:http (ESTABLISHED)

node    3984 user   11u  IPv4 0xdedc29123b1494cf      0t0  TCP *:51311 (LISTEN)

I am wondering how this works. I thought the os would refuse the bind my http server since the port was already alloted to dropbox but to my surprise it worked. Anyone thoughts?


參考解法

方法 1:

TCP sockets match against the 4‑tuple (source‑ip, source‑port, destination‑ip, destination‑port). As long as all four of them don't clash, you can have port reuse.

As long as your daemon doesn't receive a connection from 108.160.163.34:80 your stack can handle it. If the server 108.160.163.34 is well‑behaved it won't let an application initiate a connection to your socket (172.20.10.2:51311) with 80 as source port. (bind() should fail with Address already in use).

If it isn't well behaved, the existing dropbox connection will receive an unexpected packet (wrong sequence number space) and your stack will RST it.

方法 2:

The HTTP port being used by Dropbox is at 108.160.263.34, not your local host.

Port 51311 is being used as one outbound port and one listening port. Not 'two services running on the same port'. Otherwise there would be two LISTENING lines.

(by omgpythonjmanuser207421)

參考文件

  1. Two processes using the same port? (CC BY‑SA 3.0/4.0)

#sockets #HTTP #TCP






相關問題

Ці павінен UDP-сокет праходзіць працэс прыняцця, як TCP-сокеты? (Does UDP socket need to go through the Accept Process like TCP sockets?)

як запусціць каманду openssl з прыкладання java (how to run openssl command from a java application)

TypeError: непадтрымоўваны сокет тыпу аперанда Python (TypeError: unsupported operand type-python socket)

套接字編程:某些 ISP 是否對 FTP 上傳施加了速率限制? (Socket programming: Do some ISP's impose rate-limiting on FTP uploads?)

兩個進程使用同一個端口? (Two processes using the same port?)

Akka TCP 客戶端:如何使用 akka actor 通過 TCP 發送消息 (Akka TCP client: How can I send a message over TCP using akka actor)

無法運行 python-bluez RFCOMM 服務器示例腳本 (Cannot run python-bluez RFCOMM server example script)

Java中的套接字和進程 (Sockets and Processes in Java)

在網絡環境中從 Brother TD-4100N 打印機檢索打印機狀態 (Retrieving the printer status from the Brother TD-4100N printer in a network environment)

通過套接字連接發送 GUI/TUI (Sending a GUI/TUI Over a Socket Connection)

如果服務器無法訪問,則在 android 上運行的客戶端將關閉並退出應用程序,無異常或函數“connect (socket)”中的任何消息 (the client running on android closes and exit application without exception or any message in function “connect (socket)” if the server is unreachable)

使用 C 的 select() 系統調用為 UDP 應用程序創建多個客戶端和一個服務器 (Creating Multiple Client and One Server for UDP application using select() system call with C)







留言討論