# Encoding
- Protocol Buffers의 binary wire format 설명
- Base 128 Varints: 마지막을 제외한 모든 바이트는 MSB가 세팅됨. 나머지 7비트들의 그룹으로 2의보수를 구성. least significant group이 먼저임.
  1 == 0000 0001
  300 == 1010 1100 0000 0010
 - Message Structure: 키/값 구조, 메시지의 바이너리 버전에서 키 => 필드넘버와 wire_type.
  key: (field_number << 3) | wire_type
TypeMeaningUsed For
0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded messages, packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, float
 
----------------------------------------------------------------
예제) SomeMsg.proto
message SomeMessage {
  required int32 field1 = 1;
  required int32 field2 = 300;
}
SecondMessage msg = SecondMessage.newBuilder().setField1(10).setField2(20).build();

00001000 => field_number = 1wire_type = 0
00001010 => 8 + 2 = 10
11100000 => field_number = 1100(and...)wire_type = 0
00010010 => field_number = 10010 1100 = 256 + 32 + 8 + 4 = 300
00010100 => 16 + 4 = 20
---------------------------------------------------------------- 
 - More Value Types
- Signed Integers: 음수의 경우 sint32가 int32보다 효율적
- Non Varint Numbers: 32bit = type 5, 64bit = type 1
- Strings: type 2, string, bytes, embedded messages, packed repeated fields
- Embedded Messages: 
- Optional And Repeated Elements: repeated 필드는 같은 태그넘버를 갖는 0개 이상의 key-value pairs. 연속되지 않고 다른 필드들과 섞여 있을수도 있음. 파싱될 때 순서 보존됨. 메시지에 하나의 (optional 혹은 required) 필드가 두 번 이상 나타나면 파서는 마지막 값을 취함. Embedded Message 필드의 경우 병합함.
- Packed Repeated Fields: 2.1.0버전부터 추가됨, [packed=true] 옵션, 0개의 엘리먼트를 포함한 필드는 메시지에 나타나지 않고, 1개이상이면 type 2 (length delimited) 방식. repeated primitive numeric 필드만  packed가 될 수 있음.
- Field Order: 필드넘버 순서대로 저장하는 게 좋음 (제공된 C++, Java, Python serialization 코드에서처럼), 하지만 파서는 임의 순서여도 파싱할 수 있어야 함.
unknown 필드는 Java, C++ 파서는 known 필드를 순서대로 저장한 뒤에 임의순서로 붙임. Python은 known 필드를 무시함.
 
Posted by 天下太平
,
Google Protocol Buffers

Thrift
http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers
 
Google Protocol Buffer
# Overview 
- C++, Java, Python 지원
- *.proto 파일로 Protocol Format을 정의
- protoc 컴파일러로 *.proto 파일 컴파일
- 생성된 Message 클래스에 있는 Builder 클래스 사용

- 새로운 필드가 쉽게 추가될 수 있고, 중계서버들이 모든 필드를 알필요 없이 단순히 파싱하고 통과시킬 수 있게됨.
- 포맷이 좀더 파악하기 쉽고, 다양한 언어로 다룰 수 있음.
- 자동생성된 시리얼라이징 코드로 인해 수동 파싱을 피할 수 있게 됨
- RPC 요청으로 사용되는 것을 넘어 저장 포맷으로 쓰이기 시작함.
- 서버 RPC Interface가 protocol 파일로 선언되기 시작함.

# Language Guide
- 필드타입열거: scalar 타입, composite 타입.
- 태그할당: 유니크한 정수 태그, 메시지 바이너리 포맷에서 필드 구분, 메시지를 사용하기 시작한 뒤로 변경 불가. 1~15 (1바이트, 자주 등장하는 요소에 할당), 19000~19999는 Protocol Buffers를 위해 예약.
- 필드규칙열거: required - 오직 하나, optional - 0개 또는 1개, repeated - 0개 부터 n개(순서가 보존) [packed=true] 사용해야 효율적. required를 사용보다는 커스텀 Validation을 권장.
- 여러개의 메시지 타입을 하나의 proto파일에 기술 가능
- // 코멘트 가능

- Scala Value Types
http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/proto.html#scalar
- optional 필드는 디폴트 값을 가질 수 있다. [default = 10] 지정하지 않으면 (empty string, false, 0)
- Enumeration: enum 키워드, 32bit integer
- Other Message Types: 같은 .proto 파일에 정의한 후 필드로 사용 가능 
 - import "myproject/other_proto.proto"
- Nested Types: 
- Groups : deprecated use nested types
- Updating A Message Type
  기존숫자태그 변경X
  새 필드는 optional or repeated이어야 함
  예전 코드에서 파실할 때 새 필드는 무시되나 버려지지는 않음. (Python에서는 버려짐)
  Non-repeated 필드는 삭제가 가능 (단, 새 메시지에서 태그번호가 사용되지 않아야 함) OBSOLETE_ 붙여 이름변경하는것을 추천
  Non-repeated 필드는 extension으로 컨버팅 가능
  int32, uint32, int64, uint64, bool은 호환됨
  sint32, sing64 호환됨
  string, bytes 호환 가능
  Embeded Message는 bytes와 호환 가능
  fixed32는 sfixed32, fixed64, sfixed64와 호환됨
  디폴트 값의 변경은 일반적으로 OK

- Extensions
- Choosing Extension Numbers
- Packages
- Packages and Name Resolution: C++ 스타일, 가장안쪽부터 차례로 찾음.
- Defining Services: RPC
- Options: java_package
- Custom Options
- Generating Your Classes
Posted by 天下太平
,

[link] CLOSE_WAIT

Network 2009. 7. 2. 20:55
Posted by 天下太平
,
Posted by 天下太平
,

[LINK] TCP/IP 관련 URL

Network 2008. 12. 19. 01:24
Posted by 天下太平
,