개념 TCP는 TCP Segment data 송신도중 발생될 수 비트 오류를 검출하기 위해 체크섬을 사용한다. 송신자는 체크섬 계산알고리즘에 의해 계산한 체크섬을 TCP 체크섬 헤더에 삽입하여 송신하게 되며, 수신자는 동일 알고리즘즘으로 수신받은 데이터를 검사해 봄으로써 오류여부를 파악한다. TCP 체크섬은 TCP 체크섬 계산에 사용되는 헤더 및 데이터를 16비트 단위로 분할하여 비트 합을 구한뒤, 이에대한 1의 보수를 취함으로써 계산된다. 체크섬 계산에 사용되는 간단한 원리는 다음과 같다. 아래 3바이트를 예로 들면 (계산의 단순화를 위하여 8비트 단위로 나누었다) 00110011 처음 두개 바이트의 비트 합은 00110011 이며 carry는 발생되지 않았다. 이 계산 결과와 마지막 1바이트의 계산 합을 구해보면 11111111 이며 carry가 발생되었다 따라서 warp around를 적용하면, 11100101 위와 같은 계산 결과를 얻을 수 있고 이 결과에 대한 1의 보수는 00011001 이며 이것이 체크섬 값이 된다. 송신자는 원본 데이터와 체크섬을 함께 전달하게 되며 수신자는 데이터와 체크섬을 모두 더한다. 이 결과 모든 비트가 1일경우는 정상 어느 하나라도 0 비트가 있을 경우 데이터가 변조된 것을 알 수 있다. (n + 1의보수(n) = 1 이므로) TCP 체크섬 계산 예제 패킷 소개 이해하기 쉬운 TCP 체크섬 계산 법을 설명하기 위해 아래와 같은 sample data를 예를 들어 설명하겠다. 참고로 초록색은 이더넷 헤더, 파란색은 IP헤더, 붉은 색은 TCP헤더이며 검정색은 TCP DATA이다. — Sample Data ---------------------------------------------------- 0000 00 0c 29 48 9a f2 00 0c 29
b1 45 1f 08 00 45 00 o 총 길이 : 264 byte <Wireshark를 통한 예제 패킷 캡쳐 화면> 체크섬 계산 순서 1. Pseudo header 생성
Sample 데이터를 기반으로 pseudo header를 만들경우 아래와 같이 만들수 있다. 맨끝 TCP 길이 부분 2바이트(00e6)는 TCP 세그먼트 총 길이(230 byte)의 HEX표현임을 참고하라. pseudo header : c0 a8 f6 82 c0 a8 f6 81 00 06 00 e6 참고로 이 패킷의 IP 헤더는 아래와 같다
45 00 2. 만들어진 pseudo header 및 TCP Segment의 16비트 단위 합을 구한다. (warp around 적용) 2-1 pseudo
header 합
예제 데이터의 경우 TCP 헤더는 붉은색 부분이며, 체크섬은 아래 노란색 음영 부분이다. (TCP 헤더 구조 참조) 예제 데이터는 이미 수신받은 패킷이므로 송신측에서 계산한 체크섬 C7 18이 기록된 상태이지만, 아래의 데이터가 계산에 사용되는 TCP Segement 데이터 이며 warp around를 적용하여 합을 구하면 c9a4 값을 구할 수 있다. 00 50 c0 6e fb 1d 71 30 0a 92 df 90 50 18 2-3. pseudo header 16비트 합 + TCP Segment 16비트 합
3. 합 결과에 1의 보수를 적용하여 체크섬 계산을 완료 한다. 38E7 -> 0011 1000 1110 0111 이 경우 C718이 체크섬 이며 이는 TCP 헤더의 체크섬 필드에 기록된 데이터와 같음을 확인할 수 있다. |