您的位置:首页 > 理论基础 > 计算机网络

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

2017-06-27 09:29 375 查看
一.两种网络模型

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息