Post date: Nov 30, 2016 3:37:46 AM
다들 아시겠지만 udp는 수신자 와 발신자 사이의 비연결 지향 네트웍 프로그램이다. 다시 말하자면 데이터를 주고 받기 위해서 tcp처럼 connect와 accept 를 사용하지 않아도 된다는 의미... 그러나 connect는 필요할때 사용해도 된다는 말씀..
이번 신규 개발한 sms 발신기의 인증을 위해 간단한 테스트 프로그램을 만들어 달라기에.. 아무 생각없이 udp socket을 하나 생성하고 정상적으로 sms가 발송되는것을 확인하고 인증 팀에게 건네 주었다..
참고로 신규 개발한 sms 발신기는 udp 를 이용해서 20004 port 으로 받고 20005 port로 보내도록 udp 프로그램 되어 있다
얼마후...
인증팀에서 연락이 왔서
"근데 과장님.. sms 발신기로 문자 보내면.. feedback은 오지 않나요? 뭐 정상적으로 보냈다던지.. 실패 했다던지...?"
"정상적으로 발송은 되는데... feedback이 전혀 없어요..."
..."??? 분명 ack 나 nak가 오면 프로그램에 display하도록 해 놨는데..왜 안오지? "
나는 다시 내 소스를 훑어 보았지만 별다른 문제를 발견하지 못했다.. 근데..왜? ack nak가 오지않지?
sms 발신기가 20004번으로 받도록 되어 있으니 내가 20004번으로 보내면 되고 sms 발신시가 20005번으로 보내니 내가 20005번으로 받으면 되는데... 음 ..이상하네...
그래서 Ethereal로 네트웍 팻킷을 까 보기 시작했다..
오 그런데 이게 뭐야 ?
왜 sms 발신기쪽에서 보낸 팻킷의 source port가 43567 이고 dest port 20004번 이야?
그래도 20004번으로 보냈으면 난 받아야 하는데... .......
결국 난 나의 슈퍼맨에게 이 현상에 대해 얘기를 했고.. 대박으로 한대 맞았을 뿐이다..
슈퍼맨 왈 : "너 udp 에서 connect를 한 이유가 뭐니?"
나 왈 : " 네? 당근.. 특정 포트만으로 데이터를 주고 받기 위한 거죠..." connect를 한다는 socket을 생성할때 ip와 port를 할당
한다는 거잖아요.."
슈퍼맨 왈 : "니가 그런말을 하고도 무슨 이윤지 모르겠냐?"
나 왈 : " ......"
맞다.. 난 20004번 20005번 port를 udp를 생성할 때 할당 시켜 놓았지만.. sms 발신기 놈이 43567 port를 사용하고 있기 때문이었다..
그래서 나의 소스중 udp를 생성한뒤 connect 하는 부분을 주석으로 살짝 가려 놓고 테스트 해보니 ack , nak를 정상적으로 받을 수 있었다....
그럼 왜?
udp에서는 굳이 connect를 하지 않아도 데이트를 주고 받을 수 있는데 connect를 사용할수 있도록 했을까?
그건 단순한 이유인것 같다...
만약 udp팻킷을 받을때 보안상 특정 port에 대해서만 받기를 원할때... 예를 들어 tcp는 사용할수 없고 그렇다고 모든 udp 팻킷을 받으면 안될때... 이렇때 사용하고자 하는 포트를 미리 할당 해 놓으면 해당 port를 사용하는 udp 팻킷만 사용할 수 있다는것이겠지.. 참 재미있는 논리다.. 이런 논리를 예측하고 만들어 놓은 네트웍 설계자는 더 재밌다는 생각이 든다..