2022. 1. 27. 14:36ㆍMajor`/컴퓨터 네트워크
전송 계층 (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 통신 과정
- 연결 확립 요청
- 데이터 전송
- 연결 종료 요청
① 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에 변조가 있었음을 알 수 있다