BOOTP 에 대해서. BOOTP 패킷 형식(BOOTP Packet Format)
위의 BOOTP 특성에서 알아봤듯이, BOOTP에서 정보를 교환한다는 것은 클라이언트가 보낸 요청과 서버가 보내는 답장 쌍을 이루는 것이다.
BOOTP도 일반적인 다른 '요청 / 응답 프로토콜'들과 마찬가지로 요청 및 응답에 사용되는 공통된 메시지 형식을 정의해서 사용하고 있다.
구현하기 나름이겠지만, 일반적으로 클라이언트는 요청메시지의 크기만큼의 메모리 공간을 모두 0으로 초기화 하는 것 부터 시작한다.
그런 다음 이전 항목에서 보았던 것처럼 각각의 메시지 필드를 채운 다음 요청을 서버로 보낸다.
사실 역시 구현하기 나름이겠지만, 일반적으로 서버측은 메세지를 처음부터 다시 작성하지 않고, 클라이언트로 부터 받은 요청을 메모리에 복사하고 특정 필드를 변경하여 응답을 작성한다.
BOOTP 메시지는 상당한 수의 필드를 포함하므로 메시지 형식이 상당히 크다.
UDP 데이터그램 내부의 BOOTP 메세지를 간단히 살펴보자.
IP패킷에 의해 캡슐화 된 UDP데이터그램이 있고,
UDP 데이터그램에 의해 캡슐화 된 BOOTP Message가 있다.
300 바이트, BOOTP Message의 전체 형식은 천천히 살펴보자.
아래 그림과 같다.
Field Name | Size(bytes) | Description |
Op | 1 | Operation Code: 메시지의 타입을 지정함. 1은 요청, 2는 응답 |
HType | 1 | Hardware Type: 로컬 네트워크에서 사용하는 하드웨어 유형을 지정한다. ARP 메시지의 HRD필드와 동등한 방식으로 사용된다. 몇가지 공통된 값은 아래와 같다. 1 : Ethernet(10MB) 6 : IEEE 802 Networks 7 : ARCNET 15 : Frame Relay 16 : Asynchronous Transfer Mode(ATM) 17 : HDLC 18 : Fibre Channel 19 : Asynchronous Transfer Mode(ATM) 20 : Serial Line |
HLen | 1 | Hardware Address Length: 이 메시지 내에서 하드웨어 주소의 길이를 지정함. 이더넷 혹은, IEEE 802 MAC 주소를 사용하는 다른 네트워크에서, 이 값은 6임. 이것은 ARP 필드 형식에서 비슷한 이름 (HLN)을 가진 필드와 동일함. |
Hops | 1 | 요청을 전달하기 전에 클라이언트에 의해 0으로 설정되고, BOOTP relay agent가 BOOTP 메시지를 포워딩 제어하는데 사용함 |
XID | 4 | Transaction Identifier: 클라이언트가 생성한 32비트 식별 값. BOOTP서버에서 받은 응답과 요청을 매칭시키기 위해 사용함. |
Secs | 2 | Seconds: RFC 951에 의하면, 클라이언트는 이 필드에 “클라이언트가 부트를 시도한 시점부터 경과된 초단위 시간 값"을 넣는다. 이것은 BOOTP 서버에 정보를 제공함으로써, 어느것부터 응답해야 할지를 결정하는데 도움을 준다. 불행히도 이 정의는 다소 모호했기에, 전원이 켜진 직후부터의 시간값의 양인지 혹은 첫번째 BOOTREQUEST 메시지가 보내진 이후부터를 의미하는지 명확하지 않았다. 게다가 몇몇 장치는 이 필드를 잘못 구현하기까지 했다. 결론적으로 이 필드는 항상 사용되는 것이 아니다. |
Flags | 2 | Flags: 원래 BOOTP 표준(RFC 951)에서는, 이 필드는 2바이트의 공백이었다. RFC1542에서는 하나의 flag를 포함하는 ‘flags’ 필드로 변경되었다. |
CIAddr | 4 | Client IP Address: 클라이언트가 계속 사용하려는 현재 IP 주소를 가지고 있으면, 이 필드에 그 원하는 IP 주소를 넣는다. 이 필드를 채우면 클라이언트는이 주소로 전송 된 유니 캐스트 IP 데이터 그램에 응답하기 위해 커밋합니다. 그렇지 않으면 이 필드를 모두 0으로 설정하여 서버에 주소 할당을 원한다는 것을 알려준다. |
YIAddr | 4 | “Your” IP Address: 서버가 클라이언트에 지정하는 IP 주소. 이는 클라이언트가 현재 사용하는 IP 주소와 다를 수 있다. |
SIAddr | 4 | Server IP Address: BOOTREPLY 메시지를 보내는 BOOTP 서버의 IP주소 |
GIAddr | 4 | Gateway IP Address: 이 필드는 BOOTP 릴레이 에이전트가 BOOTP 요청의 통신을 용이하게 하고 다른 서브넷이나 네트워크에있는 클라이언트와 서버간에 회신 할 때 BOOTP 메시지를 라우팅하는 데 사용된다. 이름을 이해하려면 "router"에 대한 이전 TCP / IP 용어는 "gateway"입니다. BOOTP 릴레이 에이전트는 일반적으로 라우터이다. 이 필드는 클라이언트가 0으로 설정하고 BOOTREPLY를 처리 할 때 클라이언트가 무시해야 한다. 이것은 특히 일반적인 IP 라우팅 용도로 사용될 기본 라우터 주소의 주소를 클라이언트에 제공하는 서버를 나타내지는 않는다. |
CHAddr | 16 | Client Hardware Address: BOOTREPLY를 보내는 클라이언트의 L2 계층 하드웨어 주소. 장치의 할당 된 IP 주소를 검색하고 응답 메시지를 전달하는 데 사용된다. |
SName | 64 | Server Name: BOOTREPLY를 보내는 서버는 이 필드에 서버이름을 지정하거나 지정하지 않을 수 있다. 이것은 간단한 텍스트로 "nickname"와 같은 게 될 수도 있고, 아니면 완전한 DNS 도메인 이름 (예 : "myserver.organization.org") 이 될 수도 있다. 클라이언트는 요청을 만들때, 이 필드값을 지정할 수 있다. 만약 지정한다면, 그것은 이 이름을 가진 BOOTP서버로부터만 응답을 원한다는 의미이다. 이것은 클라이언트가 한 서버에만 저장된 특정 부트 파일에 액세스 할 수 있도록하기 위해 수행 될 수 있다. |
File | 128 | Boot Filename: 부트스트랩 과정을 완료하기 위해 클라이언트가 다운로드 받을 수 있는 부트 파일의 전체 디렉토리 경로와 파일이름을 포함하는 필드. 클라이언트는 여기에 텍스트로 설명을 입력하여 특정 유형의 파일을 요청할 수 있다. 혹은 이 필드를 공백으로 남겨두고, 서버가 기본 파일의 이름을 제공하게 할 수 있다. |
Vend | 64 | Vendor-Specific Area: 원래는 제조사(공급업체)로 하여금 BOOTP를 다른 유형의 하드웨어 요구에 맞게 수정할 수 있도록 허용하는 필드다. 이 필드는 지금은 제조사 독립적인 설정 정보를 보관하는데에도 사용한다. |
앞서 언급했지만, BOOTP 서버/클라이언트의 양측의 요청 및 응답 메세지는 UDP 메시지로 캡슐화되어 전송된다.
BOOTP 표준(rfc951)에서는 UDP checksum 사용을 'optional'로 정의하고 있다.
UDP checksum을 사용하면 데이터 무결성 오류를 방지 할 수 있으므로 권장된다.
그러나 이 기능은 종종 아주간단히 구현된 클라이언트 측에서는 받아 들일 수없는 처리 요구를 유발할 수도 있기때문에, checksum을 합법적으로 생략할 수도 있다.
참고로, 간결함을 위해, BOOTP는 메세지 패킷이 분할(fragmented) 되지 않는다고 가정한다.
이를통해 BOOTP 클라이언트는 분할된 메세지를 모으고, 시퀀스 넘버순서대로 다시 합치는 복잡한 과정을 피할수 있다.
패킷의 분할을 지원하지 않으면, 각 레이어 별로 길이가 초과되는 경우에 어떻게 처리되어야 하는가 고민이 생길수도 있다.
하지만, BOOTP메세지는 모든 TCP/IP연결에서 요구되는 최소 MTU보다도 작은, 겨우 300바이트 길이이기 때문에, 일반적으로 이는 문제가 되지 않는다.
BOOTP 관련 포스팅
2016/12/30 - [Software Dev Note/Embedded Linux] - [네트워크/프로토콜] BOOTP 에 대해서. BOOTP란? BOOTP 특성?
'개발자의 기록 노트 > Embedded Linux' 카테고리의 다른 글
[네트워크/프로토콜] BOOTP 에 대해서. BOOTP 클라이언트/서버의 메세지전송과 주소설정 방법 (0) | 2017.05.07 |
---|---|
eth0 에 고정 IP 주소할당하기(static IP address) (0) | 2017.01.18 |
[임베디드/판다보드] Networking Interface Initialize (0) | 2017.01.10 |
Kernel command line 보는 방법 (0) | 2017.01.05 |
[네트워크/프로토콜] BOOTP 에 대해서. BOOTP란? BOOTP 특성? (1) | 2016.12.30 |
PandaBoard ES : 부팅용 SD card 준비 (0) | 2016.12.16 |