일단 양쪽 서버를 모두 mtu를 9000으로 맞춰놓고 확인 시작. 한쪽에서 ftp로 다른쪽 서버로부터 파일을 다운로드 받기로 했다.
ftp 192.168.101.130
Connected to 192.168.101.130.
220 (vsFTPd 2.0.1)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.101.130:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,101,130,219,120)
150 Here comes the directory listing.
...
226 Directory send OK.
ftp> get test.tar
local: test.tar remote: test.tar
227 Entering Passive Mode (192,168,101,130,145,183)
150 Opening BINARY mode data connection for test.tar (22773760 bytes). (이 시점에서 블록됨)
receive aborted (서버쪽 ftp 데몬을 내리고 client에서 Ctrl+C로 중지)
waiting for remote to finish abort
226 File send OK.
421 Service not available, remote server has closed connection
ftp> quit
안된다.
mtu를 조정해보았지만, 1500을 넘는 순간(즈음, 그러니까 jumbo frame의 범위 내에 들어가는 순간) 저런 현상이 발생한다. 혹시나 해서 데몬을 내린 후에 jumbo frame을 세팅하고 다시 데몬을 실행하고 테스트 해봤는데 동일한 현상을 보인다.
점보프레임 관련 sysctl 값이 있는지 확인, 없음.
결국 서버와 클라이언트 쪽에서 tcpdump로 패킷을 잡아보기로 결정.
linux# tcpdump -i eth0 -w my.cap
으로 저장된다. 참고로 -s 옵션을 사용하여 패킷당 저장할 byte 수를 지정할 수 있다. 기본적으로 96 byte를 저장하는것 같다.
이렇게 저장된 캡쳐는 wireshark(ethereal)에서 불러오기 기능으로 적재할 수 있다. 서버쪽에서 확인한 결과,
tcpdump로 잡은 패킷을 Wireshark로 읽어들인 내용, 서버
#215와 #216은 Data Connection을 연결하면서 각자의 MSS 사이즈를 주고받은 것으로 보인다. 둘다 8960 byte를 송수신이 가능하다고 체크했고, 실제 데이터는 #221에서 전송되었는데, 이 전송된 부분이 #224, #236, #237, #266에서 재전송이 발생했다.
같은 방법으로 클라이언트에서 확인했다.
tcpdump로 잡은 패킷을 Wireshark로 읽어들인 내용, 클라이언트
아무 패킷도 잡히지 않았다. 데이터 패킷은, 짐작컨데 #35와 #36 사이에 도착했어야 맞을것 같다. 재미있는건 #42와 #43에 LLDP라는 프로토콜로 무엇인가 도착했는데, 짐작컨데 Switch쪽에서 보내온 것 같다. 뒤쪽이 잘렸지만 정확한 메시지는 'Packet size limited during capture' 였는데, 문득 들은 생각은 혹시 이거 스위치에서 지원하지 않는게 아닐까?
그렇다. 미안하다. 서버 투 서버로 Cross 연결한 것이 아니라 서버와 서버간에 (당연히!) 스위치가 들어가 있었던 것이다.
스위치는 Linksys 제품이였고, SRW2024, SRW2048중 한개였던것 같은데 (어쨌든 둘다 세팅은 같으므로;), 메뉴얼에서 jumbo frame 관련 항목을 찾아보니 과연 있었다.
SRW2024(2048) 공식 메뉴얼 중, 발췌
세팅하고 어떻게 됐느냐고? 당연히 잘된다. (...)
참고로 랜카드마다 허용되는 Max MTU값은 각각 다른듯 하다. 사용한 것으로 추정되는 Intel 82563EB 칩셋의 경우에는 9216byte가 최대치였다. 각자의 랜카드 스펙을 참고한다.
linux# ifconfig eth1 mtu 9216 (잘 적용된 케이스)
linux# ifconfig eth1 mtu 9217 (최대치를 오버)
SIOCSIFMTU: 부적절한 인수 (한글판 linux;;)
linux#