-> 블로그 이전

[Network] 전송 계층 (Transport Layer)

2022. 1. 27. 14:36Major`/컴퓨터 네트워크

전송 계층 (Transport Layer)

- 목적지에 신뢰할 수 있는 Data를 전달하기 위해 필요한 Layer

- 패킷이 전송과정에서 아무 문제 없이 제대로 목적지에 도착할 수 있도록 패킷 전송을 제어 

  • Network 혼잡 상황에 따라 패킷의 전송량을 조절해서 패킷의 흐름을 제어
  • 패킷 전송의 오류를 점검해서 목적지까지 패킷이 제대로 도착했는지 확인 

- Layer 1, 2, 3(물리, 데이터 링크, 네트워크) 이 3계층만 있어도 목적지에 Data 전송은 가능

  • but, 전송 과정에서 Data가 손상/유실되면 이에 대한 책임은 안진다

>> 이러한 문제점을 해결하기 위한 계층 : Layer 4 (전송 계층) 

 

전송 계층 역할 (Transport Layer)

- Layer3에서 라우팅 기능을 통해서 Data를 전송

  • (라우팅 정보 오류, 라우터 문제, 패킷 손상)의 원인 때문에 목적지에 Data가 도착하지 못할 수도 있다
  • Layer 4에서는 Data가 목적지에 정확하게 전달될 수 있도록 도와준다

 

▶ 오류 점검

- 오류 점검 기능(체크섬)을 통해서 오류가 발생하면 Data 재전송 요청

 

▶ 목적지 식별

- 전송된 Data의 목적지(Application)포트번호를 통해서 식별


연결형 통신 / 비연결형 통신

연결형 통신 (TCP : Transmission Control Protocol)

- Data를 목적지에 문제없이 정확하게 전달

- 서로서로 확인해가면서 Data 전달

 

비연결형 통신 (UDP : User Datagram Protocol)

- Data를 목적지에 최대한 빠르게 전달

- 일방적으로 상대방에게 Data 전달

 


 

TCP (Transmission Control Protocol)

- 신뢰성/정확성을 우선으로 하는 연결형 통신

- Data를 패킷단위로 분할 (여러 개의 작은 조각) 

  • Packet의 전송 속도 조절, Packet이 목적지에 제대로 전송되는지 확인
  • TCP로 전송할 때 붙이는 헤더 : TCP 헤더

>> TCP 헤더 + Data : 세그먼트 (Segment)

- Data를 Packet단위로 분할해서 전송

- Packet 전송 과정을 연결형 통신 방식으로 제어

- 수신한 Packet들을 재조립하는 방식으로 신뢰성/정확성 확보

 

TCP 헤더

출발지 포트 번호/목적지 포트 번호 (Source Port/Destination Port)

- 출발지/목적지의 주소를 판별하기 위해서 IP 주소 + 포트 번호가 필요

  • IP 주소 = Layer 3 : IP 헤더에 존재

 

순서번호 (Sequence Number)

- 전송하는 Data의 순서

- 송신측에서 "이 Data는 몇 번째 Data이다"라는 것을 수신측에 알려주는 역할

  • 일련번호 덕분에, 수신측은 쪼개진 segment의 순서를 파악해서 올바른 순서로 Data 재조립 가능
  • 최초로 Data를 전송할 때는 일련번호를 Random수로 초기화하고, 이후 보내는 Data의 1byte당 일련번호를 1씩 증가시켜서 Data의 순서를 표현
  • 최대 4,294,967,296까지의 수를 담을 수 있다 : 이 수를 넘어갈 경우, 다시 0부터 시작

 

확인 응답 번호 (Acknowledgment Number)

- 수신측"다음 데이터 (x번째) 보내주세요"라는 것을 송신측에 알려주는 역할 

 

헤더 길이 (Header Length)

- 전체 segment중, 헤더가 아닌 Data가 시작되는 위치가 어디부터인지 표시

- 헤더 길이 값에 4를 곱하면, 실제 Data의 시작 위치를 파악할 수 있다

 

예약 영역 (Reserved)

- 미래를 위해 예약된 필드

  • 모두 0으로 채워져야 한다

 

코드 비트 (Code Bits)

- 연결의 제어 정보가 기록

URG ACK PSH RST SYN FIN
0 0 0 0 0 0
  • 초깃값은 모두 0이고, bit가 활성화되면 1로 변경된다

 

▶ URG

- Urgent Pointer 필드에 값이 채워져있음을 알리는 플래그

  • Urgent Pointer가 가리키는 Data는 가장 우선적으로 처리된다

▶ ACK

- '확인 응답 번호' 필드에 값이 채워져있음을 알리는 플래그

  • 이 플래그가 0이면 '확인 응답 번호' 필드 자체가 무시된다

▶ PSH

- 수신측에게 해당 Data를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그

  • 0 : 수신측은 자신의 buffer가 다 채워질 때까지 기다린다
  • 1 : 이 segment 이후에 더 이상 연결된 segment가 없음을 의미

▶ RST

- 이미 연결이 확립되어 있는 상태인 상대방에게 연결을 강제로 리셋시키도록 요청하는 플래그

▶ SYN

- 상대방과 연결을 생성할 때, 순서 번호의 동기화를 맞추기 위한 segment임을 의미

▶ FIN

- 상대방과 연결을 종료하고 싶다는 요청인 segment임을 의미

 


※ TCP 통신 과정

  1. 연결 확립 요청
  2. 데이터 전송
  3. 연결 종료 요청

① TCP 연결 확립 : 3-way 핸드셰이크

- 연결 : 가상의 독점 통신로

  • 연결을 확립해야 서로 Data를 주고받을 수 있다
  • SYN, ACK 필요

- SYN : 연결 요청

- ACK : 요청 확인 응답

- 3-way 핸드셰이크 : 연결을 확립하기 위해 Packet 요청을 3번 교환하는 것

  • (1) 연결 확립 요청 (송신측) : 연결 확립 요청 패킷을 전송 (SYN)
  • (2) 요청 확인 응답 + 연결 확립 요청 (수신측) : 연결 확립 허가 응답을 위한 패킷 전송 (ACK) + 동시에 연결 확립 요청 패킷 전송 (SYN)
  • (3) 요청 확인 응답 (송신측) : 연결 확립 허가 응답을 위한 패킷 전송 (ACK)

(1) 연결 확립 요청 (송신측)
URG ACK PSH RST SYN FIN
0 0 0 0 1 0
(2) 요청 확인 응답 + 연결 확립 요청 (수신측)
URG ACK PSH RST SYN FIN
0 1 0 0 1 0
(3) 요청 확인 응답 (송신측)
URG ACK PSH RST SYN FIN
0 1 0 0 0 0

 

② 데이터 전송

- 연결 확립이 되면 Data를 전송할 수 있는 연결 통로가 생성

  • 송신측에서 Data를 전송하면, 수신측에서는 Data 도착 여부반드시 송신측에게 알려줘야 한다
  • 여기서 확인 응답 번호가 활용된다 : "다음에는 x번째 Data를 보내주세요" 

 

③ TCP 연결 종료 : 4-way 핸드셰이크

- Data 전송이 완료된 후, 연결을 끊을 때도 연결을 끊기 위한 요청을 교환해야 한다

  • FIN, ACK 필요

- FIN : 연결 종료 요청

- ACK : 요청 확인 응답

- 4-way 핸드셰이크 : 연결을 종료하기 위해 Packet 요청을 4번 교환해야 한다

  • (1) 연결 종료 요청 (송신측) : 연결 종료 요청을 위한 패킷 전송 (FIN)
  • (2) 연결 종료 응답 (수신측) : 연결 종료 허가 응답을 위한 패킷 전송 (ACK)
  • (3) 연결 종료 요청 (수신측) : 연결 종료 요청을 위한 패킷 전송 (FIN)
  • (4) 연결 종료 응답 (송신측) : 연결 종료 허가 응답을 위한 패킷 전송 (ACK)

- 수신측에서 FIN을 전송하기 전전송한 패킷에 문제가 발생해서(라우팅 지연, 패킷 유실) FIN패킷보다 늦게 도착한다면

  • 송신측에서 세션을 종료시킨 후, 늦게 도착한 패킷이 있으면 해당 패킷은 Drop되고, Data는 유실된다
  • 이러한 현상을 대비해서 송신측은 수신측으로부터 FIN을 수신해도 일정시간(default 240초) 동안 세션을 남겨놓고, 잉여 패킷을 기다리는 과정을 거치게 된다 : "TIME_WAIT"
(1) 연결 종료 요청 (송신측)
URG ACK PSH RST SYN FIN
0 0 0 0 0 1
(2) 요청 확인 응답 (수신측)
URG ACK PSH RST SYN FIN
0 1 0 0 0 0
(3) 연결 종료 요청 (수신측)
URG ACK PSH RST SYN FIN
0 0 0 0 0 1
(4) 요청 확인 응답 (송신측)
URG ACK PSH RST SYN FIN
0 1 0 0 0 0

 

윈도우 사이즈 (Window Size :: rwnd)

- 한번에 전송할 수 있는 Data의 양

  • 최대 : 216 = 65535byte

- segment 하나를 보낼 때마다 확인 응답을 1번 반환하면 효율이 낮다

  • 매번 확인 응답을 기다리는 대신 segment를 window size만큼 보내고 난 뒤, 한 번에 확인 응답을 받으면 효율이 높아진다
  • 받은 segment를 일시적으로 보관하는 장소 : 버퍼 (buffer) 
  • 버퍼 덕분에 segment를 연속적으로 보내도 수신 측은 대응할 수 있다

- 만약, 수신측에서 대량의 Data를 감당하지 못하면 오버플로우(Overflow) 발생

  • 오버플로우가 발생하지 않도록 buffer의 한계 크기 = window size를 알고 있어야 한다

>> window size는 Receiver가 Sender에게 ACK를 보낼때 같이 보내준다

 

체크섬 (CheckSum)

- Data를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값

  • 전송할 Data를 16bit씩 나눠서 차례대로 더해가는 방법으로 생성
  • "Pseudo Header"가 필요하다
  • Pseudo Header는 직접적인 전송에 쓰이지 않고, 단지 checksum 계산에서만 사용
Pseudo Header
Field Byte 설명
출발지 IP 주소 4 IP헤더의 출발지 IP 주소에서 추출
목적지 IP 주소 4 IP헤더의 목적지 IP 주소에서 추출
예약 필드 1 나중을 위해서 예약된 필드 (0x00)
→ 항상 0으로 이루어져 있다
프로토콜 1 IP헤더의 Protocol에서 추출
→ TCP : 6
→ UDP : 17
TCP 세그먼트 길이 2 TCP 헤더 + Data의 총 길이

※ Example

1. Pseudo Header 생성

  • 출발지 IP 주소 : 211.249.221.246 → d3 f9 dd f6
  • 목적지 IP 주소 : 192.168.0.15 → c0 a8 00 0f
  • 예약 필드 : 0 → 00
  • 프로토콜 : TCP = 6 → 06
  • TCP 세그먼트 길이 : 32 → 00 20 

>> d3 f9 dd f6 c0 a8 00 0f 00 06 00 20


2. Pseudo Header / TCP segment의 16비트 단위 합을 구하기 (warp around 적용)

(1) Pseudo Header 16bit 단위 합

d3f9 ddf6 c0a8 000f 0006 0020
d3f9 >> 1101 0011 1111 1001
ddf6 >> 1101 1101 1111 0110
:: 1b1ef >> 1 1011 0001 1110 1111 - (carry)
1b1ef >> 1 1011 0001 1110 1111
b1f0 >> 1011 0001 1111 0000 - result (wrapped around)
b1f0 >> 1011 0001 1111 0000
c0a8 >> 1100 0000 1010 1000
:: 17298 >> 1 0111 0010 1001 1000 - (carry)
17298 >> 1 0111 0010 1001 1000
7299 >> 0111 0010 1001 1001 - result (wrapped around)
7299 >> 0111 0010 1001 1001
000f >> 0000 0000 0000 1111
:: 72a8 >> 0111 0010 1010 1000 - result
72a8 >> 0111 0010 1010 1000
0006 >> 0000 0000 0000 0110
:: 72ae >> 0111 0010 1010 1110 - result
72ae >> 0111 0010 1010 1110
0020 >> 0000 0000 0001 0000
:: 72ce >> 0111 0010 1010 1110 - final result

 

(2) TCP segment의 합 (Header + Data)

- 01bb 1e34 2b62 84cc 187a 6b43 8010 001f aba1 0000 0101 050a 187a 6b42 187a 6b43

  • 예제 Data는 이미 수신받은 패킷이므로 송신측에서 계산한 체크섬 aba1가 기록된 상태이다
  • 송신자가 송신전에 체크섬을 만들 때는 이 aba1 필드의 Data를 0으로 세팅해서 계산해야 한다
01bb 1e34 2b62 84cc 187a 6b43 8010 001f 0000 0000 0101 050a 187a 6b42 187a 6b43
01bb >> 0000 0001 1011 1011
1e34 >> 0001 1110 0011 0100
:: 1fef >> 0001 1111 1110 1111 - result
1fef >> 0001 1111 1110 1111
2b62 >> 0010 1011 0110 0010
:: 4b51 >> 0100 1011 0101 0001 - result
4b51 >> 0100 1011 0101 0001
84cc >> 1000 0100 1100 1100
:: d01d >> 1101 0000 0001 1101 - result
d01d >> 1101 0000 0001 1101
187a >> 0001 1000 0111 1010
:: e897 >> 1110 1000 1001 0111 - result
e897 >> 1110 1000 1001 0111
6b43 >> 0110 1011 0100 0011
:: 153da >> 1 0101 0011 1101 1010 - (carry)
153da >> 1 0101 0011 1101 1010
53db >> 0101 0011 1101 1011 - result (wrapped around)
53db >> 0101 0011 1101 1011
8010 >> 1000 0000 0001 0000
:: d3eb >> 1101 0011 1110 1011 - result
d3eb >> 1101 0011 1110 1011
001f >> 0000 0000 0001 1111
:: d40a >> 1101 0100 0000 1010 - result
d40a >> 1101 0100 0000 1010
0000 >> 0000 0000 0000 0000
:: d40a >> 1101 0100 0000 1010 - result
d40a >> 1101 0100 0000 1010
0000 >> 0000 0000 0000 0000
:: d40a >> 1101 0100 0000 1010 - result
d40a >> 1101 0100 0000 1010
0101 >> 0000 0001 0000 0001
:: d50b >> 1101 0101 0000 1011 - result
d50b >> 1101 0101 0000 1011
050a >> 0000 0101 0000 1010
:: da15 >> 1101 1010 0001 0101 - result
da15 >> 1101 1010 0001 0101
187a >> 0001 1000 0111 1010
:: f28f >> 1111 0010 1000 1111 - result
f28f >> 1111 0010 1000 1111
6b42 >> 0110 1011 0100 0010
:: 15dd1 >> 1 0101 1101 1101 0001 - (carry)
15dd1 >> 1 0101 1101 1101 0001
5dd2 >> 0101 1101 1101 0010 - result (wrapped around)
5dd2 >> 0101 1101 1101 0010
187a >> 0001 1000 0111 1010
:: 764c >> 0111 0110 0100 1100 - result
764c >> 0111 0110 0100 1100
6b43 >> 0110 1011 0100 0011
:: e18f >> 1110 0001 1000 1111 - final result

 

(3) Pseudo Header 16비트 합 + TCP Segment 16비트 합

72ce>> 0111 0010 1010 1110 - final result
e18f >> 1110 0001 1000 1111 - final result
:: 1545d >> 1 0101 0100 0101 1101 - (carry)
1545d >> 1 0101 0100 0101 1101
545e >> 0101 0100 0101 1110 - final result (wrapped around)

3. 2-(3) 결과에 1의 보수를 적용해서 최종 체크섬 계산 완료

545e >> 0101 0100 0101 1110
1의 보수 적용
1010 1011 1010 0001 = aba1

  • 체크섬이 정확하게 구해졌다

- 수신측은 Data를 받으면 위의 과정을 동일하게 거치되 1의 보수를 취하지 않은 값까지 만든다

  • 그렇게 만든값과, 송신측에서 보낸 체크섬을 더해서 모든 비트가 1이라면 해당 Data는 정상이다
  • but, 모든 비트가 1이 아니라면 송신측이 보낸 Data에 변조가 있었음을 알 수 있다

 

긴급 포인터 (Urgent Pointer)

- URG 플래그가 1이라면, 수신측은 긴급 포인터가 가리키고 있는 Data를 우선 처리한다

 

옵션 (Options)

- TCP의 기능을 확장할 때 사용하는 필드

  • 크기가 가변적이다
  • 수신측이 어디까지가 헤더이고, 어디서부터 Data인지 알기 위해서 헤더 길이를 사용하는 것이다

 

포트 번호 (Port Number)

- Layer 4에서는 이 포트번호를 보고 어떤 Application이 사용할 Data인지 식별한다

  • TCP 헤더에 출발지/목적지 포트 번호가 존재하기 때문에 어떤 Application이 사용할 Data인지 구분할 수 있다

- 16비트를 사용

  • 0 ~ 65535번까지의 번호가 사용 가능하다
포트 구별 번호 범위 설명
웰 노운 포트
Well-Known Ports
 0 ~ 1023번 서버 Application용으로 예약된 포트
등록된 포트
Registered Ports
1024 ~ 49151번 자주 이용되는 서버 Application을 식별하기 위한 포트
동적 포트
Dynamic Ports
49152 ~ 65535번 클라이언트 Application용 임시 포트

 

Well-Known Ports

- HTTP(웹), FTP(파일 전송), SMTP(이메일 전송) 등, 인터넷에서 널리 사용되는 서버 Application이 사용하도록 예약된 번호이다

Well-Known Ports
포트 번호 서버 Application
20 FTP (파일 전송)
22 SSH (원격제어, 보안 기능 추가)
23 Telent (원격제어)
25 SMTP (이메일 전송)
80 HTTP (웹)
110 POP3 (이메일 수신)
143 IMAP4 (이메일 수신, 보관 기능 추가)
443 HTTPS (웹, 보안 기능 추가)

 

Registered Ports

- Well-Known Ports이외에 자주 이용되는 서버 Application을 식별하기 위한 포트


포트를 사용한 다중 연결

- 동시에 여러 웹 페이지를 볼 수 있는 건

  • 서로 다른 Data가 오고 가는 상황에서, Layer 4가 포트 여러 개를 사용해서 각각 따로 통신을 하기 때문
  • (1) 웹 브라우저 : 포트 80
  • (2) 이메일 전송 : 포트 25
  • (3) 파일 전송 : 포트 20

- IP 주소 + 포트 번호로 통신 상대방을 식별한다

  • 포트 번호가 동일해도, IP 주소는 호스트마다 서로 다르기 때문에 식별 가능하다

 

UDP (User Datagram Protocol)

- 신속성/효율성을 우선으로 하는 비연결형 통신

- TCP와 달리, Data를 보낼 때 요청/응답을 하지 않고 일방적으로 보낸다

  • 스트리밍/동영상 서비스에서 주로 사용

- LAN에 존재하는 Network 장비에 Data를 일괄적으로 보낼 수 있다 : 브로드캐스트 (Broadcast)

- 너무 단순해서 서비스의 신뢰성이 낮고, Datagram 도착 순서가 바뀌거나/중복되거나/누락되기도 한다

  • UDP로 전송할 때 붙이는 헤더 : UDP 헤더
  • UDP 헤더 +Data : 데이터그램 (Datagram)

 

UDP 헤더

출발지 포트 번호/목적지 포트 번호 (Source Port/Destination Port)

- 출발지/목적지의 주소를 판별하기 위해서 IP 주소 + 포트 번호가 필요

  • IP 주소 = Layer 3 : IP 헤더에 존재

 

전체 길이 (Total Length)

- Header + Data를 합한 Datagram의 전체 길이를 정의

 

체크섬 (CheckSum)

- Data를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값

  • 전송할 Data를 16bit씩 나눠서 차례대로 더해가는 방법으로 생성
  • "Pseudo Header"가 필요하다
  • Pseudo Header는 직접적인 전송에 쓰이지 않고, 단지 checksum 계산에서만 사용
Pseudo Header
Field Byte 설명
출발지 IP 주소 4 IP헤더의 출발지 IP 주소에서 추출
목적지 IP 주소 4 IP헤더의 목적지 IP 주소에서 추출
예약 필드 1 나중을 위해서 예약된 필드 (0x00)
→ 항상 0으로 이루어져 있다
프로토콜 1 IP헤더의 Protocol에서 추출
→ TCP : 6
→ UDP : 17
UDP 데이터그램 길이 2 UDP 헤더 + Data의 총 길이
→ 홀수일 경우, 짝수로 바꿔줘야 하기 때문에
0값을 가지는 1byte padding이 필요하다


※ Example

1. Pseudo Header 생성

  • 출발지 IP 주소 : 142.250.199.100 → 8e fa c7 64
  • 목적지 IP 주소 : 192.168.0.15 → c0 a8 00 0f
  • 예약 필드 : 0 → 00
  • 프로토콜 : UCP = 17 -> 11
  • UCP 세그먼트 길이 : 33 -> 00 21

>> 8e fa c7 64 c0 a8 00 0f 00 11 00 21


2. Pseudo Header / UDP Datagram의 16비트 단위 합을 구하기 (warp around 적용)

(1) Pseudo Header 16bit 단위 합

8efa c764 c0a8 000f 0011 0021
8efa >> 1000 1110 1111 1010
c764 >> 1100 0111 0110 0100
:: 1565e >> 1 0101 0110 0101 1110 - (carry)
1565e >> 1 0101 0110 0101 1110
565f >> 0101 0110 0101 1111 - result (wrapped round)
565f >> 0101 0110 0101 1111
c0a8 >> 1100 0000 1010 1000
:: 11707 >> 1 0001 0111 0000 0111 - (carry)
11707 >> 1 0001 0111 0000 0111
1708 >> 0001 0111 0000 1000 - result (wrapped round)
1708 >> 0001 0111 0000 1000
000f >> 0000 0000 0000 1111
:: 1717 >> 0001 0111 0001 0111 - result
1717 >> 0001 0111 0001 0111
0011 >> 0000 0000 0001 0001
:: 1728 >> 0001 0111 0010 1000 - result
1728 >> 0001 0111 0010 1000
0021 >> 0000 0000 0010 0001
:: 1749 >> 0001 0111 0100 1001 - final result

 

(2) UDP Datagram의 합 (Header + Data)

- 01bb c401 0021 0cf5 4deb 88be e57a e317 b1ce 17e0 00dc 51ce 7afb 0276 51e3 fdf8 8d00

  • 예제 Data는 이미 수신받은 패킷이므로 송신측에서 계산한 체크섬 0cf5가 기록된 상태이다
  • 송신자가 송신전에 체크섬을 만들 때는 이 0cf5 필드의 Data를 0으로 세팅해서 계산해야 한다
  • 마지막 00은 길이를 짝수로 만들기 위해 1byte padding을 더해준 것이다
01bb c401 0021 0000 4deb 88be e57a e317 b1ce 17e0 00dc 51ce 7afb 0276 51e3 fdf8 8d00
01bb >> 0000 0001 1011 1011
c401 >> 1100 0100 0000 0001
:: c5bc >> 1100 0101 1011 1100 - result
c5bc >> 1100 0101 1011 1100
0021 >> 0000 0000 0010 0001
:: c5dd >> 1100 0101 1101 1101 - result
c5dd >> 1100 0101 1101 1101
0000 >> 0000 0000 0000 0000
:: c5dd >> 1100 0101 1101 1101 - result
c5dd >> 1100 0101 1101 1101
4deb >> 0100 1101 1110 1011
:: 113c8 >> 1 0001 0011 1100 1000 - (carry)
113c8 >> 1 0001 0011 1100 1000
13c9 >> 0001 0011 1100 1001 - result (wrapped around)
13c9 >> 0001 0011 1100 1001
88be >> 1000 1000 1011 1110:
:: 9c87 >> 1001 1100 1000 0111 - result
9c87 >> 1001 1100 1000 0111
e57a >> 1110 0101 0111 1010
:: 18201 >> 1 1000 0010 0000 0001 - (carry)
18201 >> 1 1000 0010 0000 0001
8202 >> 1000 0010 0000 0010 - result (wrapped around)
8202 >> 1000 0010 0000 0010
e317 >> 1110 0011 0001 0111
:: 16519 >> 1 0110 0101 0001 1001 - (carry)
16519 >> 1 0110 0101 0001 1001
651a >> 0110 0101 0001 1010 - result (wrapped around)
651a >> 0110 0101 0001 1010
b1ce >> 1011 0001 1100 1110
:: 116e8 >> 1 0001 0110 1110 1000 - (carry)
116e8 >> 1 0001 0110 1110 1000
16e9 >> 0001 0110 1110 1001 - result (wrapped around)
16e9 >> 0001 0110 1110 1001
17e0 >> 0001 0111 1110 0000
:: 2ec9 >> 0010 1110 1100 1001 - result
2ec9 >> 0010 1110 1100 1001
00dc >> 0000 0000 1101 1100
:: 2fa5 >> 0010 1111 1010 0101 - result
2fa5 >> 0010 1111 1010 0101
51ce >> 0101 0001 1100 1110
:: 8173 >> 1000 0001 0111 0011 - result
8173 >> 1000 0001 0111 0011
7afb >> 0111 1010 1111 1011
:: fc6e >> 1111 1100 0110 1110 - result
fc6e >> 1111 1100 0110 1110
0276 >> 0000 0010 0111 0110
:: fee4 >> 1111 1110 1110 0100 - result
fee4 >> 1111 1110 1110 0100
51e3 >> 0101 0001 1110 1101
:: 150c7 >> 1 0101 0000 1100 0111 - (carry)
150c7 >> 1 0101 0000 1100 0111
50c8 >> 0101 0000 1100 1000 - result (wrapped around)
50c8 >> 0101 0000 1100 1000
fdf8 >> 1111 1101 1111 1000
:: 14ec0 >> 1 0100 1110 1100 0000 - (carry)
14ec0 >> 1 0100 1110 1100 0000
4ec1 >> 0100 1110 1100 0001 - result (wrapped around)
4ec1 >> 0100 1110 1100 0001
8d00 >> 1000 1101 0000 0000
:: dbc1 >> 1101 1011 1100 0001 - final result

 

(3) Pseudo Header 16비트 합 + UDP Datagram 16비트 합

1749>> 0001 0111 0100 1001 - final result
dbc1 >> 1101 1011 1100 0001 - final result
:: f30a >> 1111 0011 0000 1010 - final result

 

3. 2-(3) 결과에 1의 보수를 적용해서 최종 체크섬 계산 완료

f30a >> 1111 0011 0000 1010
1의 보수 적용
0000 1100 1111 0101 = 0cf5

  • 체크섬이 정확하게 구해졌다

- 수신측은 Data를 받으면 위의 과정을 동일하게 거치되 1의 보수를 취하지 않은 값까지 만든다

  • 그렇게 만든값과, 송신측에서 보낸 체크섬을 더해서 모든 비트가 1이라면 해당 Data는 정상이다
  • but, 모든 비트가 1이 아니라면 송신측이 보낸 Data에 변조가 있었음을 알 수 있다