2009-05-14 12 views
15

Xem định nghĩa của TCP header trong /netinet/tcp.h:Tại sao trường 8 bit lại có độ bền?

struct tcphdr 
    { 
    u_int16_t th_sport;   /* source port */ 
    u_int16_t th_dport;   /* destination port */ 
    tcp_seq th_seq;    /* sequence number */ 
    tcp_seq th_ack;    /* acknowledgement number */ 
# if __BYTE_ORDER == __LITTLE_ENDIAN 
    u_int8_t th_x2:4;   /* (unused) */ 
    u_int8_t th_off:4;   /* data offset */ 
# endif 
# if __BYTE_ORDER == __BIG_ENDIAN 
    u_int8_t th_off:4;   /* data offset */ 
    u_int8_t th_x2:4;   /* (unused) */ 
# endif 
    u_int8_t th_flags; 
# define TH_FIN  0x01 
# define TH_SYN  0x02 
# define TH_RST  0x04 
# define TH_PUSH  0x08 
# define TH_ACK  0x10 
# define TH_URG  0x20 
    u_int16_t th_win;   /* window */ 
    u_int16_t th_sum;   /* checksum */ 
    u_int16_t th_urp;   /* urgent pointer */ 
}; 

Tại sao lĩnh vực 8-bit có một thứ tự khác nhau trong endianness? Tôi nghĩ rằng chỉ có các trường 16 bit và 32 bit quan trọng với thứ tự byte, và bạn có thể chuyển đổi giữa các endian với ntohs và ntohl, tương ứng. Chức năng này sẽ dùng để xử lý những thứ 8 bit? Nếu không có, có vẻ như là một TCP sử dụng tiêu đề này trên một máy cuối nhỏ sẽ không làm việc với một TCP trên một máy cuối lớn.

+0

Thật lạ, bạn đã tìm thấy tệp tiêu đề này trên hệ thống nào? – fbonnet

+0

debian linux. phiên bản này được bao gồm nếu __USE_BSD là #defined. – Claudiu

Trả lời

21

Có hai loại lệnh. Một là thứ tự byte, một là thứ tự bitfield. Không có thứ tự tiêu chuẩn nào về thứ tự bitfield trong ngôn ngữ C. Nó phụ thuộc vào trình biên dịch. Thông thường, thứ tự của các bitfield được đảo ngược giữa các endian lớn và nhỏ.

+1

điều này có vẻ giống như câu trả lời chính xác, và tôi có một hồi ức mơ hồ về việc nghe nó trước đây, nhưng tôi không thể trong lương tâm tốt mà không có trích dẫn ... bạn có thể cung cấp một câu trả lời không? – rmeador

+0

đây là câu trả lời duy nhất có ý nghĩa với tôi – Claudiu

+0

không nên là __BIG_ENDIAN_BITFIELD/__ LITTLE_ENDIAN_BITFIELD sau đó? Hoặc họ ngầm giả sử rằng endianness giữ nguyên như nhau giữa các lệnh byte và bitfield? – Slava

0

Việc đọc nhận xét của tôi là hai trường một byte được hiểu là giá trị hai byte (hoặc - dường như là một byte không được sử dụng). Thay vì khai báo một giá trị hai byte, chúng khai báo hai giá trị một byte nhưng đảo ngược thứ tự khai báo tùy thuộc vào kết thúc.

+0

Không, rõ ràng là có ý định xác định hai trường 4 bit. Xem ví dụ http://www.freesoft.org/CIE/Course/Section4/8.htm cho bố cục tiêu đề TCP. –

3

Có thể trong máy này, endianess cũng đề cập đến thứ tự bit cũng như thứ tự byte. This wikipedia article đề cập rằng đôi khi trường hợp này xảy ra.

+0

Trong câu hỏi này, nó không liên quan đến thứ tự bit. – kcwu

11

Điều này phụ thuộc vào trình biên dịch và không di động. Làm thế nào các lĩnh vực bit được đặt hàng là thực hiện phụ thuộc, nó sẽ là tốt hơn ở đây để sử dụng một lĩnh vực 8-bit và thay đổi/mặt nạ để có được các trường con.

+0

Nghe như một kế hoạch tốt hơn cho tôi. –

1

Sự hiểu biết của tôi là thứ tự bit và tính cuối cùng thường là hai điều khác nhau. Các cấu trúc với các trường bit thường không di động trên các trình biên dịch/kiến ​​trúc. Đôi khi ifdefs có thể được sử dụng để hỗ trợ các thứ tự bit khác nhau. Trong trường hợp này, endianness thực sự không liên quan và nó sẽ là một ifdef về thứ tự bit. Giả định rằng một số endianesses có một thứ tự bit nhất định có thể đúng trong một số trường hợp.

0

Có thể giúp bạn biết rằng đây là mã chỉ chạy nếu "# ifdef __FAVOR_BSD". Đó là từ /usr/include/netinet/tcp.h

# ifdef __FAVOR_BSD 
typedef u_int32_t tcp_seq; 
/* 
* TCP header. 
* Per RFC 793, September, 1981. 
*/ 
struct tcphdr