본문 바로가기

개발 노트/네트워크

[프로토콜] TCP Checksum (TCP 체크섬)

반응형

❍ TCP Checksum


- TCPTCP Segment data 송신 도중 발생될 수 있는 비트 오류를 검출하기 위해 체크섬을 사용합니다. 송신자는 체크섬 계산알고리즘에 의해 계산한 체크섬을 TCP 체크섬 헤더에 삽입하여 송신하게 되며, 수신자는 동일 알고리즘으로 수신받은 데이터를 검사해 봄으로써 오류여부를 파악합니다. TCP 체크섬은 TCP 체크섬 계산에 사용되는 헤더 및 데이터를 16비트 단위로 분할하여 비트 합을 구한 뒤, 이에 대한 1의 보수를 취함으로써 계산됩니다. 비트합 계산 중 Carry가 발생될 경우에는 Wrap around를 적용합니다.

- Checksum 계산 순서


(1) Pseudo Header 생성

Pseudo Header는 총 12바이트 길이로써 일부 IP Header를 참조하여 만들어 집니다.

필드명

크기

설 명

Source IP

4

출발지 IP

Destination IP

4

목적지 IP

Reserved (항상 0)

1

8비트, 항상 0이다

프로토콜

1

IP헤더에서 알아낸 프로토콜 필드 값

TCP 길이

2

TCP 헤더 + DATA의 총 길이(바이트)



(2) Pseudo Header TCP Segment16비트 단위 합을 구합니다. (wrap around 적용)

Pseudo Header : 12바이트, 96비트의 Pseudo Header 16비트 씩 나누면 총 6개의 항이 나옵니다. 순차적으로 Wrap around 적용해 가며 총 합을 구합니다.

TCP Segment(Header + Data) : TCP 헤더와 DATA에 대한 16비트 단위 합을 구합니다. 이 때 TCP 헤더의 체크섬 부분은 0으로 초기화 하여 계산합니다.


(3) (1)의 결과 (2)의 결과를 합한 후 1의 보수를 적용하여 전송된 TCP Segment 데이터의 Checksum과 같은지 확인합니다. 다르다면 데이터 전송에 오류가 있으므로 재전송을 요구합니다.



C 코드 (링크)

unsigned short CheckSum(unsigned short *buffer, int size)
{ unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(unsigned short);
} if(size) cksum += *(unsigned short*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (unsigned short)(~cksum); 
}

반응형

'개발 노트 > 네트워크' 카테고리의 다른 글

[프로토콜] IP Header  (0) 2018.11.05
[프로토콜] UDP Header / UDP 동작  (0) 2018.10.30
[프로토콜] TCP 통신  (0) 2018.10.28
[프로토콜] TCP 프로토콜 동작 방식  (0) 2018.10.27
[프로토콜] TCP Header  (0) 2018.10.24