Linux基础编程之网络基础编程一
作者:互联网
1.OSI模型及TCP/IP协议模式
2 TCP/IP体系结构分层
以http协议为例,客户端向服务器发送一个http包,首先上http包头+数据作为TCP包的数据,再加上TCP包头作为IP包的数据,再加上MAC包头,发送至服务端。同理,服务端接受到此数据包也需要分层拆解。下图是发送接受模型。
3 数据包拆分流程图
4 以太网链路层格式
5 各层包头信息
IP包头
//come from /usr/include/linux/ip.h struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) //小端定义方式 __u8 ihl:4, //表头长度 version:4; //版本 #elif defined (__BIG_ENDIAN_BITFIELD) //大端时 __u8 version:4, ihl:4; #else #error "Please fix <asm/byteorder.h>" #endif __u8 tos; //服务类型 __be16 tot_len; //总长度 __be16 id; //识别码 __be16 frag_off; //分段位移 __u8 ttl; //存活值 __u8 protocol; //协议代码 __sum16 check; //校验码 __be32 saddr; //源IP地址 __be32 daddr; //目的IP地址 /*The options start here. */ };
TCP包头
//come from /usr/include/linux/tcp.h #ifndef _LINUX_TCP_H #define _LINUX_TCP_H #include <linux/types.h> #include <asm/byteorder.h> #include <linux/socket.h> struct tcphdr { __be16 source; //源端口号 __be16 dest; //目的端口号 __be32 seq; //封装序号 __be32 ack_seq; // ACK序号 #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; //紧急信息 };
UDP包头
// come from /usr/include/linux/udp.h #ifndef _LINUX_UDP_H #define _LINUX_UDP_H #include <linux/types.h> struct udphdr { __be16 source; //源端口号 __be16 dest; //目的端口号 __be16 len; //长度 __sum16 check; //校验码 };
标签:__,u8,编程,基础,TCP,Linux,包头,be16,include 来源: https://www.cnblogs.com/haibiandemoumoumou/p/14358843.html