IP패킷과 UDP패킷에서 헤더길이
안녕하세요 질문올립니다
질문1.
리눅스에서 RAW 소켓을 공부하다가 이상한 점을 발견했는데요
IP 패킷의 헤더길이 필드는 16비트이며 unsigned short 타입으로 2바이트이고
UDP 패킷의 헤더길이 필드도 마찬가지 입니다
그런데 IP 헤더필드의 경우 바이트 순서를 Big Endian 으로 해주면 안되더군요?
반면에 UDP 의 경우는 Big Endian 으로 해줘야 합니다
그래서 UDP 의 경우는 htons 함수를 써줘야 하는데
IP 는 안써줘야 하더군요...?
왜그런걸까요?
왜 어떤 필드는 리틀엔디안, 어떤필드는 빅엔디안 방식을 쓸까요? 햇갈리게;;
질문2.
그리고 프로그래밍중에
RAW 소켓으로 만든 UDP 패킷과
일반 DGRAM 소켓으로 만든 UDP 패킷이 있는데요
패킷을 보내는 컴퓨터에서 스니퍼를 돌려서 이 패킷들을 덤프해본결과
완벽하게 일치했습니다(RAW 소켓으로 완벽하게 같은 패킷을 만들었습니다)
그런데 왠일?
수신하는 컴퓨터에서 RAW 소켓으로 송신한 패킷만 인식을 못하더군요
어떻게 된 일인가 한참 삽질한 끝에
수신하는 쪽 컴퓨터에도 스니퍼로 패킷을 덤프해보니
DGRAM 소켓으로 만든 UDP 헤더의 체크섬필드가
송신할때 스니핑해서 본값과
수신될때 스니핑해서 본 값이 서로 다르더군요?
반면에 RAW 소켓으로 만든 패킷은 일치하구요...
제가 UDP 체크섬 구하는 알고리즘을 돌린게 아니라
스니퍼로 체크섬 필드를 본다음 나머지 바이트들을 완벽하게 일치하게 맞추고
마지막에 체크섬을 추가해줬거든요...
근데 이게 알고보니 잘못된건가봐요
어째서 이런일이 일어날까요?
어째서 송신측 컴퓨터에서 스니핑 해서 봤던 UDP 체크섬의 값이
수신측 컴퓨터에서 스니핑해서 본 값과 다를까요?
누가 체크섬을 변경시킨 걸까요?
스니퍼가 하필 체크섬부분만 잘못 읽어낼리는 없으므로
스니퍼가 잘못됬을 가능성은 없다고 봅니다.
설명해주실분...
추가질문3.
IP 헤더의 체크섬은 순수 IP 헤더만을 이용해서 구합니다(이건 확실합니다)
UDP 와 TCP 는 Pseudo 헤더를 앞에 추가해서 구합니다.
이때 UDP 와 TCP 의 경우 Data Payload 에 대해서도 체크섬 구할때
포함해야 하나요? 즉 Data Payload 가 변경된다면 UDP 또는 TCP 의 체크섬 값이 달라져야 하나요?
어떤 문서에서는 포함한다고 봤는데 어디서는 안하는거같아서 햇갈려서 질문합니다.
또한 지금까지 UDP 체크섬값은 그냥 0 을 주면 안쓰는거로 처리해서 장땡으로 아는데
체크섬을 반드시 생성해 줘야만 하는 경우도 있나요? TCP 는 어떤가요?
IP 체크섬은 RAW소켓의 경우 커널이 자동 생성하던데...
PACKET 타입 소켓을 써도 자동 생성해 줄까요?
소중한 조언 기다리겠습니다
댓글 달기