2009-06-23 11 views
5

소켓 패킷을 사용하여 UDP 패킷을 보내는 간단한 Python 스크립트가 있습니다. 이 스크립트는 내 Windows 상자에서 제대로 작동하지만 내 Ubuntu Linux PC에서는 보내는 패킷이 약간 다릅니다. Windows에서 IP 헤더의 플래그 필드는 0이지만 Linux에서 동일한 코드를 사용하면 플래그 필드가 4로 설정된 패킷이 생성되었습니다. 스크립트를 수정하여 Windows 및 Linux에서 일관된 동작을 유지하도록하고 싶습니다.IP 헤더의 플래그 필드 설정

소켓 모듈의 플래그 필드를 제어하는 ​​방법이 있습니까? 또는이 설정을 Linux에서 변경해야합니까?

+1

상황에 맞는 스크립트를 확인하는 것이 좋습니다. – Almad

답변

2

실제로 flags 필드가 4 대신 2 = b010으로 설정되었다고 추측합니다. 플래그 4는 유효하지 않은 IP 패킷입니다. 플래그는 IP Header의 3 비트 값임을 기억하십시오. 나는 플래그 값이 2 인 UDP 데이터 그램을 볼 것입니다. 이것은 "단편화하지 마십시오"를 의미합니다.

귀하의 질문에 관해서는, 나는 raw sockets을 사용하지 않고 IP 플래그를 직접 설정하는 방법이 있다고 생각하지 않습니다. 대부분의 응용 프로그램에는 IP 또는 UDP/TCP 헤더와 직접 관련이없는 좋은 이유가 없으므로 걱정하지 않아도됩니다.

+0

예, wireshark는 flags 필드의 값이 4라고했지만 더 자세히 살펴보면 "Do not fragment bit"만 설정되었습니다. 조각화 플래그가 없기 때문에 패킷이 삭제 될 수 있다고 걱정됩니다. – user83753

+0

그것은 리눅스의 IP 스택이 동작하는 것과 다릅니다. 이에 대한 자세한 내용은 여기 (https://bugzilla.novell.com/show_bug.cgi?id=211867)에서 확인할 수 있습니다. – SashaN

1

construct이 작업을 수행 할 수 있습니까?

+0

멋진 모듈을 살펴 보겠습니다. 그것은 플래그 비트와 함께 내 즉각적인 문제를 해결하지 않습니다. – user83753

6

다음은 내가 데려다 준 길입니다. D.Shwley의 대답에 SashaN이 게시 한 링크를 따라 갔고 Linux의 UDP 패킷에서 "조각 내기하지 마십시오"비트가 설정된 이유에 대해 조금 배웠습니다. PMTU 발견과 관련이 있다고 밝혀졌습니다. 간단히 말해, 소켓 객체에서 setsockopts 함수를 사용하여 파이썬에서 UDP 패킷의 조각화되지 않은 비트를 지울 수 있습니다.

import socket 
IP_MTU_DISCOVER = 10 
IP_PMTUDISC_DONT = 0 # Never send DF frames. 
IP_PMTUDISC_WANT = 1 # Use per route hints. 
IP_PMTUDISC_DO = 2 # Always DF. 
IP_PMTUDISC_PROBE = 3 # Ignore dst pmtu. 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect(("10.0.0.1", 8000)) 
s.send("Hello World!") # DF bit is set in this packet 
s.setsockopt(socket.SOL_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DONT) 
s.send("Hello World!") # DF bit is cleared in this packet