Version: IPv4, IPv6을 나타낸다. 현재까진 거의 IPv4를 사용한다.
IHL(IP Header Length): IP헤더의 길이를 워드 단위로 나타낸다.
TOS(Type Of Service): 서비스의 우선순위를 제공하도록 라우터에 요구한다.
Total Length: 헤더의 총 길이를 바이트 단위로 나타낸다.
Identification: 패킷의 분할 시 다시 결합하는 고윳값을 나타낸다. 분할된 패킷 쌍끼리 같은 값을 가진다.
IP Flags: 첫 번째 비트는 0으로 사용되지 않는다. 두번째 필드는 Do Not Fragment이며 값이 1인 경우 분할하지 않는다. 세번째 More Fragment 필드는 분할된 패킷 쌍에서 마지막 패킷이 아니라면 1이다.
Fragment Offset: 원본 데이터의 바이트 범위를 나타낸다.
Time To Live(TTL): 패킷을 라우터를 거치며 TTl값이 하나씩 줄어든다.
Protocol: 상위 계층의 프로토콜을 나타낸다. ICMP(1), TCP(6), UDP(17), ESP(50), AH(51) 등이 있다.
Header Checksum: 패킷의 오류를 검출한다.
Source Address: 패킷의 출발지 ip주소를 나타낸다
Destination Address: 패킷의 목적지 ip주소를 나타낸다
IP Option: 거의 사용하지않음.
IP Header의 크기는IP Option을 포함시 20바이트가 넘어가지만, 통상적으로 IP Option은 거의 사용하지않아, 20바이트로 봐도 무방하다.
위에 ip헤더 구조 표를 보면, 스크립트 안에서 사용한 변수 ip_headers[:]의 뜻이 무엇인지 알 수 있을 것이다. 스크립트에서 중요한 부분은 6~9, 12~16, 35, 37, 38, 42 라인이다
6~9, 35: data=recvfrom(65535)을 통해 얻어진 데이터는 바이트 형태로 이루어져있기때문에, 데이터를 IP헤더의 길이 20Byte와 나머지 IP페이로드를 파싱하는 작업을 함수로 정의해 놓은 것이다. struct.unpack같은 struct모듈을 통한 함수들은 따로 공부해서 이해해보길 바란다. 나도 공부하는 입장이어서 말로 설명하기는 너무 어렵다...
12~16, 42: 39~41라인처럼 그냥 ip_headers[] 출력하면 좋지만, ip_headers[4] 같은 경우는 숫자값이 나오긴하는데, IP Flags값과 Fragment Offset값이 합쳐져있어 알아볼수가 없다. 그래서 12~16라인에서 정의해놓은 함수로 ip_headers[4]를 파싱해 주어야한다.
37~38: 맨위 IP헤더 구조를 보면 첫byte에 4bit의 version값, 4bit의 IHL값이 합쳐져있다. 37번째 라인 경우에는 >> 시프트연산자를 이용하여 ip_headers[0]의 크기 1byte=8bit에서 오른쪽으로 4칸만큼이동하여 4bit만큼의 version값을 찾아낸것이다. 38번째 라인 경우에는ip_headers[0]에다가 16진수0x0F=(10진수로 15)=(2진수로 1111)를 &연산자를 통해 LSB에서부터 4비트만큼의 값을 얻어낸것이다.
결과적으로 이런 값이 나오게된다.
'Language > Python' 카테고리의 다른 글
[Python] Numpy:: 기초적인 배열 생성 (0) | 2021.11.01 |
---|---|
[Python] ftplib::기본적인 FTP 통신 (0) | 2021.10.11 |
[Python] Socket::기본적인 FTP 통신 (0) | 2021.10.06 |
[Python] Socket::Echo 클라이언트, 서버 테스트 (0) | 2021.10.06 |
[Python] Socket::간단한 소켓 통신의 구현 (0) | 2021.08.22 |