struct tcphdr {
__be16 source;
__be16 dest;
__be32 seq;
__be32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:4,
doff:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__be16 window;
__sum16 check;
__be16 urg_ptr;
};

tcp 헤더 구조체 선언부인데 처음보는 형식이라 질문 드립니다
변수명:숫자, 
왜 이런식으로 선언을 하나요?
대충 바이트 크기를 의미하는거 같은데...c99 표준 문법인가요?



추가로 하나 더 질문드려도 될련지요...
__be16 __le16 처럼 엔디안으로 따로 구분한 변수들이 있는데
얘네들은 어차피 변수에 값을 대입해도 거꾸로 값이 안들어가지 않습니까?
그런데 왜 저래 명명을 해놓았을까요?
일종의 개발할 때 헷갈리지 않기 위한 방책인가요?