UDP 소켓 프로그래밍시....
글쓴이: Necromancer / 작성시간: 금, 2004/07/16 - 2:05오후
UDP로 소켓 연결 만든 다음 sendto()와 recvfrom()을 썼을 경우 실제 어떻게
보내게 되는지 궁금해서 질문 올립니다.
UDP의 경우 패킷으로 나뉘어져서 보내게 되면 순서 없이 나가는 특징이 있다고
알고 있는데, sendto()로 한번 데이터를 보내면, 이 데이터가 몇개 UDP 패킷으로
나뉘어서 수신측에서 recvfrom()으로 수신했을 때 뒤죽박죽으로 수신되는 경우가
발생할 수가 있는지 궁금합니다... 아니면 한번 sendto() 한 것은 하나의 UDP
패킷이 되서 나가는지요?
(물론 중간에 mtu 작은 게 있다면 IP layer에서 분해/조립되겠지만요)
이유를 대자면 UDP로 FTP 대체할 프로그램 하나 만들어볼까 생각하고 있습니다.
(집에 FTP 돌리는데, 이넘이 passive모드로만 접속이 가능한데... 공유기를 쓰는
외부 환경 등에서는 안들어가지는 일이 잦아서 그렇습니다. 이유를 대자면
가정용 adsl 라인의 1024번 아래 포트 외부접속 막아서-다들 알죠- 다른 포트로
몰래 돌리고 있고, 거기다가 iptables 필터도 걸려 있고요-제가 돌리는 몇개 대몬
외는 다 막아놓았습니다. 외부 환경도 공유기나 사설망 쓰는 데가 많아서 그렇습니다)
Forums:
UDP는...
TCP가 스트림 방식을 쓴다면 UDP 는 메시지 단위로 쓴다고 생각하시면 됩니다.
하나의 메시지가 만들어지면 읽는 방식입니다.
때문에 packet size 를 잘 조절하셔야 될 것입니다.
UNP에 더욱 자세한 내용이 나와있는데 UNP 말고도 TCP/IP volume 1에도 잘 나와있습니다.
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
우선은 IP Layer에 바로 넣겠죠.그리고 IP Layer에서
우선은 IP Layer에 바로 넣겠죠.
그리고 IP Layer에서 바로 전송을 하게될껍니다.
로컬 컴퓨터 인터페이스에서는 순차적으로 전송이 된다 치더라도
네트워크에 설정된 최대 전송량보다 크면 쪼개서 보낼테구요
즉 하나의 데이타를 보내면 여러개의 데이타로 분리될수 있구요
그 데이타가 순차적으로 도착하는지 여부는 직접 구현을 해야하구요
데이타가 잃어버리지 않았는지도 직접 구현을 해야합니다.
그 구현은 서버측과 클라이언트측 둘다 포함됩니다.
한쪽만 구현하면 정상동작한다고 생각하기 힘들군요.
아마도 Transmission 컨트롤을 위해서 어러가지의 패킷을 정의해야될것
같습니다.
PS) 패킷 사이즈를 잘 조정한다구 해서 패킷 로스 현상이 않나타나는 것
아니거든요.
답변 감사합니다.다만 제가 궁금해하는 것은 한번 sendto를 할
답변 감사합니다.
다만 제가 궁금해하는 것은 한번 sendto를 할 경우 그 sendto한 데이터가
하나의 UDP 패킷이 되고 IP 레이어에서 분해되서 나가는지
아니면 여러개의 UDP 패킷으로 잘려서 나가는지 궁금해서 질문 드린 것입니다.
한번 sendto한게 하나의 UDP 패킷이라면 transmission 관련부분은 그리
어렵지 않겠지만(IP Layer에서 순서대로 분해 조립 다되겠죠), 여러개의
UDP패킷으로 잘린다면 transmission을 구현하기가 어렵게 되기 때문이죠.
Written By the Black Knight of Destruction
UDP단에서 쪼개지지는 않는다고 알고 있습니다. IP단에서 분리되고 재조
UDP단에서 쪼개지지는 않는다고 알고 있습니다. IP단에서 분리되고 재조합될 수는 있지만 도착할 땐 온전히 도착할 겁니다.
(물론, 도착하지 않거나 데이터가 손상되거나 UDP패킷간의 순서가 바뀌거나 한 패킷이 여러 개로 오거나 할 수는 있지만요)
요즘 이더넷 환경에서 UDP 로컬 브로드캐스트를 사용해서 소프트리얼타임으로 뭔가 하는 프로젝트를 진행하고 있는데, UDP패킷 크기가 이더넷MTU를 넘어서면 쪼갠 후 보내고 알아서 합쳐서 만들어주는 곳도 있고, 그냥 씹어버리는 곳도 있더군요. 무엇 때문인지는 모르겠습니다만... -_-
전산실에서 테스트했더니 되길래 수십kb짜리 패킷을 마구 쏘아대는 코드를 룰루랄라 만들었는데 테스트 환경에서는 안 되어서 좌절하고 다시 짰었지요.
그런데, UDP FTP로는 TFTP라는 프로토콜이 이미 있지 않은가요?
네, 생각하시는 대로 sendto는 단 한개의 UDP 패킷을 생성합니다.
네, 생각하시는 대로 sendto는 단 한개의 UDP 패킷을 생성합니다. recvfrom도 역시 온전한 한 개의 패킷을 수신하기 때문에 완전히 1:1 대응이 됩니다.
하지만 전송 환경에 따라 IP 패킷단에서는 여러개로 나누어질 수 있구요. 이렇게 나누어진 IP 패킷들은 같은 ID를 공유하는 것으로 알고 있습니다. 쪼개진 조각들 중 하나로 빠지면 이 UDP 패킷 전체를 버립니다.
UDP 패킷은 손실 될 수도 있지만, 일단 도착한 패킷의 내용은 보장이 됩니다. check sum이 있기 때문에 비교를 해서 다르면 패킷을 버립니다. 그러나 요즘 이더넷에서 내용이 망가지는 일은 거의 일어나지 않습니다.
댓글 달기