计算机网络的体系结构与协议首部

大耗子 2020年02月28日 185次浏览

文章链接:https://codemouse.online/archives/2020-02-28-23-26-27

分层的概念

  1. 应用层(+表示层+会话层) --->HTTP HTTPS SSH...

    解决业务逻辑的问题

  2. 传输层 TCP/UDP ->端口

    解决找到主机后,数据应该去哪的问题.引入了端口的概念

  3. 网络层 IP

    解决远程传输问题

  4. 数据链路层(+物理层) MAC-->通过ARP协议获取对端mac地址

    解决找到近端设备

IP的格式

  • 用户输入:点分十进制 程序识别:二进制

  • 网络字节序(大端序) 本地字节序(小端序 )

  • 子网掩码

    如255.255.255.0 ,用数字24代替

    24->11111111111111111111111100000000

    一个ip地址表示就是 192.168.1.1/24,代表了192.168.1.(0-254)这个段

网络与本地的转换

  • 点分十进制------>网络字节序的二进制
    in_addr_t inet_addr(const char *cp);
    int inet_aton(const char *cp, struct in_addr *inp);
    int inet_pton(int af, const char *src, void *dst);
  • 网络字节序的二进制 --->点分十进制
    char *inet_ntoa(struct in_addr in);
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

IP的首部

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;
	__be32	daddr;
	/*The options start here. */
};

IP首部

TCP的首部

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;
};

UDP首部

UDP的首部

struct udphdr {
	__be16	source;
	__be16	dest;
	__be16	len;
	__sum16	check;
};