2012-12-05 3 views
7

젠킨스에서 OS X의 포트 할당 문제를 디버깅하려고 시도했는데, 넷켓으로 특정 포트를 청취하여 이상한 결과를 초래했습니다. 2 단자에이어서왜 OS X은 동일한 TCP 포트에서 두 번 청취 할 수 있습니까?

$ uname -rs 
Darwin 12.2.1 

$ nc -l 54321 

: X 10.8.2 OS에 단말기에서


$ nc -l 54321

및 제 3 단자에

, lsof는 두 경우를 도시 동일한 포트에 바인딩 됨 :

$ lsof -i | grep 54321 
nc 70706 chris 3u IPv4 0x55618c024692f4d1  0t0 TCP *:54321 (LISTEN) 
nc 70769 chris 3u IPv4 0x55618c0232cb8661  0t0 TCP *:54321 (LISTEN) 
리눅스에 617,451,515,

:

제 1 터미널 :

$ uname -rs 
Linux 3.2.0-34-generic 

$ nc -l 54321 

제 2 터미널 :

$ nc -l 54321 
nc: Address already in use 

왜 OS X는 주소가 이미보고하지 않습니다 용도?

+1

'lsof -i' 출력 구문을 모르지만'0x55618c024692f4d1'과'0x55618c0232cb8661'은 무엇입니까? 그것이 IP 주소 인 경우, 청취자가 "임의"주소가 아닌 특정 IP 주소에 바인딩 되었기 때문에 분명합니다. – CodeCaster

+0

그들은 의미없는 메모리 주소입니다. 그들이 가지고있는 유일한 목적은 이들이 두 개의 구별되는 소켓 (예 :'fork()'또는'dup()'의 결과가 아님)을 식별하는 것입니다. – duskwuff

+0

'lsof -i'를 실행하면 해당 필드 ("DEVICE")에 27 개의 고유 한 값이 부여됩니다. 메모리 주소라고 생각합니다. 마지막 열은 소켓이'*'에 묶여 있음을 보여준다. –

답변

6

OS X의 바이너리는 완전히 중복 된 바인딩 (setsockopt on OS X)을 허용하는 SO_REUSEPORT 소켓 옵션을 설정합니다. OS X에서 dtrace를 사용하여이를 확인할 수 있습니다.

Linux에서 netcat 바이너리가이를 수행하지 않으므로 예상대로 바인드 오류가 발생합니다. 다시 strace를 사용하여이를 검증 할 수 있습니다. 나는 SO_REUSEPORT가 더 이상 사용되지 않거나 최신 Linux 커널에서도 사용할 수 없다고 믿습니다.

+0

정보를 제공해 주셔서 감사합니다! 또한 왜 다른 소프트웨어가 실행되고 있었는지,'nc' *이 포트가 이미 사용되고 있다고 불평했는지 설명합니다. –

+0

정보를 위해 SO_REUSEPORT 소켓 옵션이 Linux 3.9에 추가되었습니다. https://lwn.net/Articles/542629/ –