UDP
- transport layer
헤더가 짧다
요즘에는 streaming에도 tcp를 사용한다. udp를 사용하는 경우도 있음
tcp의 장점: reliable transfer
udp의 장점: header가 간단하다
udp 단점: unreliable transfer을 해결하기 위해 application layer에서 reliable한지 검사하기도 한다.
udp의 용도: dns
source port, destination port, length of data and UDP header(payload(data)와 header를 포함한 전체 길이), checksum
한 줄이 32bit = 1 byte => 2줄이므로 8byte
Datagram Size
- maximum data length: 65507 byte만 담을 수 있음(ip header에 의하여 datagram maximum amount가 정의된다)
- IP HEADER: datagram length(2 byte) 담음: 최대 65535 byte까지 포함, header length 부분을 제외하면 payload는 65507 byte
- 많은 플랫폼이 8192 바이트로 제한(8k)
- 구현에 따라서 576 바이트 이상은 받지 않아도 되서 데이터가 짤림
- 512 byte로 안전하게 데이터그램 사이즈 제한
Example
0: 포트 번호를 OS가 임의로 선택하게 만든다.
UDP Socket을 만든다.
DatagramSocket
timeout: 10초
-
datagrampacket을 만든다: new DatagramPacket(new byte[1], 1, host, PORT);
-
DatagramPacket 두번째 인자: byte array에서 몇 바이트를 데이터그램 패킷으로 만들 것이냐?
-
tcp는 socket open할 때 inetaddress나 socketaddress 객체를 적어준다.
-
udp는 DatagramPacket에 host address와 port number를 적는다.
-
receive할 때도 DatagramPacket에 response가 들어온다.
Multi-threading and UDP
- UDP는 multithreading을 거의 하지 않는다.
- datagram을 잘 받았는지 acknowlegement를 보내지 않기 때문이다.
- udp에서는 그냥 보내면 끝
- reponse를 기다릴 필요가 없다
DatagramPacket
- datagrampacket은 payload과 header의 representation이다.
- 목적에 따라서 request나 reponse의 용도로 사용 가능하다.
receiving data
- DatagramPacket
- 버퍼와 길이 => 0부터 시작해서 길이 -1 만큼 읽음
- 버퍼와 오프셋과 길이 => 오프셋에서 시작해서 길이-1만큼 채우려고 노력함
- request와 같음.
- length <= buffer.length - offset
- if not => exception thrown
sending data
- 바이트 배열, 길이, inetaddress destination, int port
- 보낸 패킷이 바이트 배열 길이만큼 채워짐
- 보내기 전에 데이터가 바뀐다 => 변화가 반영되서 보내짐
Getters
- 데이터그램을 받기 위한 6개의 다른 매소드 제공
- getAddress
- 데이터그램 패킷을 받고 전송할 때 어디로 전송해야 할지 정할 때 사용
- getPort 있음
- getData: 데이터그램으로부터 데이터를 포함하는 바이트 array를 가져옴
- getData, getOffset, getLength
- datainputstream 활용하여 받아옴
Setters
-
datagram을 수정하는 방법을 제공
-
data
-
remote address,
-
remote port
-
setData
- 데이터그램 패킷을 전송할 때 데이터만 바꿔서 여러개 전송
- offset을줘서 여러번 전송 가능
-
setAddress
- broadcasting:remote host에서 setPort로 broadcasting 가능
-
setLength
질문
스택오버플로우 답변 참고
IP Header에서 udp datagram의 길이를 명시하고 있는데 왜 UDP header에도 datagram 길이를 똑같이 명시하는가?
- IP 프로토콜 위가 아닌 다른 프로토콜 위에서 동작할 경우 udp length를 알 수 없기 때문이다.