인프런 커뮤니티 질문&답변
강의 외 질문
작성
·
17
0
안녕하세요 강사님
강의 내용 질문은 아니지만
하나 여쭈어보아도 될까요?
프로젝트로 혼자 미니 와이어 샤크를 만들고있는대
TCP 헤더 파싱에서 막혀서 질문드려요
// 리눅스 환경에서 qt를 이용하여 진행중이에
tcp_H* tcp_header =
(tcp_H*)((u_char*)ip_header + ip_header->ihl * 4);
qs_ret += "Seq=";
qs_ret += QString::number(ntohl(tcp_header->seq));
qs_ret += " Ack=";
qs_ret += QString::number(ntohl(tcp_header->ack_seq));이런식으로 파싱하는대 실제 와이어 샤크 값이랑 완전히 다르게 나오는대
짚히시는 이유가 있으실까요 ㅠㅠ?
AI로는 답이 안나옴니다..
아래 헤더를 사용하였어
#pragma pack(push, 1)
typedef struct tcp_H{
uint16_t source;
uint16_t dest;
uint32_t seq;
uint32_t ack_seq;
#if __BYTE_ORDER == __LITTLE_ENDIAN
uint16_t res1:4,
doff:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#else
uint16_t doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#endif
uint16_t window;
uint16_t check;
uint16_t urg_ptr;
}tcp_H;
#pragma pack(pop)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. White님, 네트워크 프로그래밍 프로젝트에서 TCP 헤더 파싱과 관련해 질문 주셔서 감사합니다.
TCP 헤더 파싱 문제 분석
TCP 헤더의 파싱에서 발생한 문제를 해결하기 위해 몇 가지 점을 살펴봐야 합니다:
바이트 정렬(padding)의 문제: 구조체의 필드가 자연스럽게 정렬되어 있지 않으면 예상치 못한 결과가 발생할 수 있습니다.
#pragma pack(push, 1)를 사용하여 구조체의 바이트 정렬을 강제로 조정하고 있지만, 여전히 주의를 기울여야 합니다.엔디안(Endian) 문제:
ntohl함수는 네트워크 바이트 오더를 호스트 바이트 오더로 변환합니다. 데이터가 Little Endian 또는 Big Endian 방식으로 잘못 해석될 수 있습니다. 현재 환경과 데이터의 엔디안 방식을 확인하시고, 필요에 따라ntohl이나htonl같은 변환 함수를 사용해야 합니다.
필드 접근 방식:
- C/C++에서 비트 필드의 순서와 크기를 주의 깊게 검사해야 합니다. 특히
#if __BYTE_ORDER부분에서 Little Endian과 Big Endian의 분기를 잘못 설정하면 데이터가 잘못 해석될 수 있습니다.
- 비트 필드의 순서가 환경에 따라 다르게 해석될 수 있으므로, 실제 구조체 레이아웃이 원하는 대로 구성되었는지 확인해야 합니다.
- C/C++에서 비트 필드의 순서와 크기를 주의 깊게 검사해야 합니다. 특히
참고 자료
이전에 논의된 TCP 관련 문제나 Wireshark의 동작 이해에 관한 토론에서 도움을 얻으실 수 있습니다:
이 정보를 바탕으로 TCP 헤더의 각 필드가 올바르게 파싱되어 있는지 한 번 더 검토해 보시는 것을 추천드립니다. 데이터를 로그로 출력하여 실제 값과 비교하며 점검하는 것도 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





