UNIX环境高级编程-读书笔记-网络编程(一)

来源:互联网 发布:淘宝致一科技 编辑:程序博客网 时间:2024/06/09 15:23

一.两种网络模型

ISO/OSI 网络拓扑模型 7层

应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

TCP/TP 网络模型 4层
应用层 用户态
——————————————————————————
传输层 内核态
网络层
链路层

我们编写程序 ,就是在传输层编写
与传输层有关的协议:
UDP 用户数据报协议
TCP 传输控制协议

二.字节序(和硬件有关)
我们称 short 是半字
int 是 字

大端模式和小端模式

大端模式:高字节存储在低地址,低字节存储在高地址
小端模式:高字节存储在高地址,低字节存储在低地址

举个例子:有一个数1 = 0b0001
高地址 低地址
大端模式:1 0 0 0
小端模式:0 0 0 1

三. 网络字节序,主机字节序

说明:网络之间的通信,是靠相互之间的主机号,和对应的端口号,
但是,存储在主机上的端口号,和在网络中传送的端口号,是不一样的。
明白的说,主机字节序,就是给人看的,但是网络字节序是给网络中的其他的主机看得
所以要进行相互的转化。一共有四个函数对他们进行转化:
uint32_t htonl(uint32_t hostlong); 主机 —> 网络 (一般用来转化ip)
uint16_t htons(uint16_t hostshort); 主机 —> 网络 (一般用来转化端口号)
uint32_t ntohl(uint32_t netlong); 网络 —-> 主机 (一般用来转化IP)
uint16_t ntohs(uint16_t netshort); 网络 —-> 主机 (一般用来转化端口号)
h: host 主机
n:network 网络
l:long 长整型
S:short 短整型

端口号和IP地址等网络需要识别的都需要进行转换

四.IP地址
ip 地址分为不同的种类,简单的说就是,在最开始的时候ip地址不够用
于是就新型拓展,在拓展的过程中,衍生出不同的类型
,有a,b,c,d等几类IP地址。

目前使用的是C类的IP地址,采用点分十进制的方法进行保存.
“192.168.1.131” 点分十进制 —-给人看得
通过函数把1923168.1.131转转换成网络字节序 —-传送到网络中,给其他的主机看得。

下面两个函数,专门转换IP地址:
struct in_addr inet_addr(const char * cp); 把主机字节序 转化成网络字节序
char *inte_ntoa(struct in_addr in); 把网络字节序 转化成主机字节序

五。IPV4的网络地址:
struct sockaddr_in
{
sa_family_t sin_family: 地址族 AF_INET:IPV4 FA_INET6:IPV6
in_port_t sin_port; 端口号(网络字节序)
struct in_addr sin_addr; IP地址 (网络字节序)
};

struct in_addr
{
in_addr_t s_addr; IP地址
}

说明:注意IPV4的网络地址里面的做后一个成员,sin_addr 类型是in_addr
这种类型的结构体里面只有一个成员就是s_addr.主要是在最初设计的时候,考虑到以后会有新加进来的东西 ,才单独又设计了一个结构体

六.套接字。
网络套接字,其实是一种文件,在这中文件里面包含的主机的网络地址 然而网络地址里面包含主机的ip地址和端口号
两个相互通信的主机就是通过套接字来进行通信的。
向套接字里面写数据就是向网络中发送数据
从套接字里面读数据就是从网络中接受数据

套接字的类型:
SOCK_STREAM 面向字节流 TCP
SOCK_DGRAM 面向数据报 UDP

函数:

int socket(int domain, int type, int protocol)
返回值: 套接字的文件描述符

domain: 协议族: AF_INET(ipv4) AF_INET6(ipv6)
type: 套接字类型 SOCK_STREAM SOCK_DGRAM
protocol: 通信使用的协议
0:该套接字类型的默认协议
IPPROTO_UDP 或者是 IPPROTO_TCP

阅读全文
0 0
原创粉丝点击