UDP를 이용하면 segment들이 손실될 수도, 순서가 바뀔수도 있다. 최선을 다하는데 보장해주지 않는 것을 말하는데, 우리는 이것을 best effort service라고 부른다.
그리고 커넥션이 없다. UDP sender와 receiver 사이의 handshaking이 없다.
각각의 UDP segment(메시지)들이 독립적으로 처리된다.
그러면 UDP는 언제 사용하는가?
손실이 일어나도 되고, 속도가 중요한 경우이다. 이를테면, streaming이나 multimedia 같은 곳에서 말이다.
그리고 DNS에서 쓴다. 한번 사용하고 끊기 떄문이다.
그리고 SNMP, HTTP/3에서 쓴다.
UDP위로 신뢰성을 옮겼다. TCP를 사용하면, 신뢰성 제공 기능이 중복되기 때문에 UDP를 사용하고 Application layer에서 reliability를 구현했다.

Application 메시지를 segment들로 나눈다.
header와 payload(application layer에서 받은 데이터) 부분으로 나눈다.
첫 줄에는 source, dest 포트번호가 있다. (IP 주소는 network layer의 ID header에 있음)
그리고 둘째 줄에는 전체 segment의 길이와 checksum이 있다.
segment의 길이 : 16비트 -> 0 ~ 2^16-1 = 65535, 이 중 헤더의 길이가 8이므로 최대 payload의 길이는 65527
checksum은 전송된 segment에 대한 오류를 판단하기 위해 존재하는 필드이다.
sender는 segment의 내용들을(헤더 + paylaod) 16비트로 나눠서 관리한다.
16비트의 수를 다 더해 checksum에 저장한다.
receiver는 받은 segment에 대한 checksum을 계산한다.
받은 Segment를 16비트씩 나눠서 다 더해서 checksum과 비교한다.
checksum과 다르면 에러로 판단, 같으면 에러가 없다고 판단한다.
하지만 checksum이 같다고 무조건 에러가 없다는 것을 의미하는 것은 아니다.

16비트가 두 개만 있다고 가정하면,
두 개를 더해서 자리 수가 올라가면 wrap around(앞의 1을 맨뒤에 더해줌) 해준다.
checksum에는 1의 보수를 취해서 저장한다. (0,1 바꿔서)