일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Xcode
- 앱리소스
- otpkey
- SSH
- apple
- WebAuthn
- 안드로이드
- MFA
- OSX
- SWIFT
- MSYS2
- 앨범북
- 인증
- 애플
- css
- openssl
- OTP
- appres
- Nodejs
- fido
- SSL
- kmip
- git
- 앱스토어
- FIDO2
- Android
- SwiftUI
- MYSQL
- 2FA
- albumbook
Archives
- Today
- Total
인디노트
TCP 헤더의 Checksum 값을 계산하는 공식 본문
- TCP 헤더의 Checksum 필드를 0으로 설정합니다.
- TCP 헤더와 TCP 데이터를 모두 합친 패킷을 16 비트 단위로 쪼개어 1의 보수를 취합니다.
- 쪼개진 16 비트 값들을 모두 더합니다.
- 더한 결과값이 16비트를 초과하면 초과한 값은 더하고, 아닌 경우에는 더하지 않습니다.
- 마지막으로 1의 보수를 취한 값이 TCP 헤더의 Checksum 필드 값이 됩니다.
Pseudo-Header Checksum (RFC 793):
[Src IP] + [Dst IP] + [0x00] + [Protocol] + [TCP Length]
(16 bits) (16 bits) (8 bits) (8 bits) (16 bits)
TCP Checksum:
[TCP Header] + [TCP Payload]
(16 bits) (variable)
TCP 체크섬을 계산하기 위해선,
TCP 헤더와 TCP 데이터를 모두 포함하는 패킷을 생성한 뒤,
위 수식을 사용하여 TCP 체크섬을 계산합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
unsigned short calculate_tcp_checksum(unsigned short *ptr, int nbytes)
{
register long sum;
unsigned short oddbyte;
register short answer;
sum = 0;
while (nbytes > 1) {
sum += *ptr++;
nbytes -= 2;
}
if (nbytes == 1) {
oddbyte = 0;
*((u_char *)&oddbyte) = *(u_char *)ptr;
sum += oddbyte;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = (short)~sum;
return (answer);
}
이 함수는 TCP 헤더의 시작 위치와 TCP 데이터의 길이를 인자로 받아서 TCP 체크섬 값을 계산하고, 계산된 체크섬 값을 리턴합니다. 이 함수는 IP 헤더와 TCP 헤더가 이미 생성되어 있다는 가정 하에 사용됩니다.
이 함수는 위에서 설명한 TCP 체크섬 계산 알고리즘을 구현하고 있습니다. 계산된 체크섬 값은 TCP 헤더의 Checksum 필드에 저장됩니다
반응형
'개발 플랫폼 및 언어 > 네트워크 기술' 카테고리의 다른 글
tcphdr 에서 data 위치 찾는 C 함수 (0) | 2023.04.16 |
---|---|
문자열로 된 ip4 주소를 unsigned char 형식으로 변환하는 C 코드 (0) | 2023.04.16 |
linux 에서 C 로 대기하고 있다가 시그널을 발생하여 다른 함수에서 시그널을 보내면 깨어나서 함수를 실행하는 C 코드 (0) | 2023.04.15 |
icmp 를 전송한 후 응답을 받아서 해당 응답이 어떤 전송건인지 확인하는 C 코드 (0) | 2023.04.14 |
iphdr 의 송신자주소 및 수신자 주소를 변경하는 C 함수 (0) | 2023.04.14 |
Comments