初学网络编程之基本概念

一、Internet的产生

Internet-“冷战”的产物

1957年10月和11月,前苏联先后有两颗“Sputnik”卫星上天

1958年美国总统艾森豪威尔向美国国会提出建立DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称ARPA

1968年6月DARPA提出“资源共享计算机网络” (Resource Sharing Computer Networks),目的在于让DARPA的所有电脑互连起来,这个网络就叫做ARPAnet,即“阿帕网”,是Interne的最早雏形
复制代码

TCP协议分成了两个不同的协议:

1、用来检测网络传输中差错传输控制协议TCP

2、专门负责对不同网络进行互联互联网协议IP

 

二、网络体系结构

OSI模型

image.png
TCP/IP协议

image.png

三、IP

IP的基本概念:

IP地址是internet中主机的标识

Internet中的主机地址与别的机器通信必须具有一个IP地址

IP地址分为32位(IPv4) 或者 128位(IPv6)

每个数据包都必须携带目的IP地址和源地址,路由器依靠此信息为数据包选择路由

表示形式:常用点分形式,如202.35.64.12,最后都会转换为一个32位的无符号整数

 

IP地址分类

一共五类

(1)A类1.0.0.1   -   126.255.255.254  政府和保留
(2)B类128.0.0.1  -   191.255.255.254 大中企业
(3)C类192.0.0.1  - 223.255.255.254    普通
(4)D类224.0.0.0 -   239.255.255.255  组播
(5)E类240.0.0.0  -  255.255.255.254  实验
复制代码

 

IP地址:192.168.1.155

         网络地址+主机地址

特殊IP:

每一个字节都为0的地址(”0.0.0.0”)对应于当前主机地址:INADDR_ANY

127.0.0.1到127.255.255.255用于回路测试。如:127.0.0.1可以代表本机IP地址,用http://127.0.0.1 就可以测试本机中配置的web服务器

IP地址中的主机地址部分每一个位都为1的IP地址,就是当前子网的广播地址

IP地址中网络部分每个位都为1,主机部分都为0的地址是子网掩码地址

IP地址中,主机部分为1的地址,xxx.xxx.xxx.1这是网关地址,路由器地址

 

子网掩码:

255.255.255.0这是子网掩码地址(C类)

一个地址中网络部分全是1,主机部分都为0的地址是子网掩码地址

 

端口号:

为了进一步区分一台主机接收到的数据包应该转交给哪个进程来处理,使用端口号来区别

(1)1-1023(1-255之间为众所周知端口,256~1023端口通常有UNIX系统占用)

(2)注册端口:1024~49150

(3)动态或私有端口:49151~65535

 

字节序:

网络中传输数据必须按照网络字节序:大端序

 

套接字socket

7种文件类型 – d p c b l s

6种进程间通信方式  管道,共享内存,信号量,信号,消息队列,套接字

进程的通信接口,特殊的文件描述符

套接字分类

(1)流式套接字TCP协议的套接字)(SOCK_STREAM)

   提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
复制代码

(2)数据报套接字UDP协议的套接字)(SOCK_DGRAM)

   提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
复制代码

(3)原始套接字(SOCK_RAW)

可以对较低层次协议如IP、ICMP直接访问。
复制代码

 

Socket编程常有API接口

TCP和UDP通信相关

socket() 创建套接字

bind() 绑定本机地址和端口

connect() 建立连接

listen() 设置监听端口

accept() 接受TCP连接

recv(), read(), recvfrom() 数据接收

send(), write(), sendto() 数据发送

close(), shutdown() 关闭套接字

网络地址转换相关函数

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *cp);

in_addr_t inet_network(const char *cp);

char *inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);
复制代码

获取和设置套接字属性

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

 

int getsockopt(int sockfd, int level, int optname,

                      void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname,

                      const void *optval, socklen_t optlen);

 

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
复制代码

主机字节顺序转换为无符号长整型网络字节顺序

uint16_t htons(uint16_t hostshort);
复制代码

主机字节顺序转换为无符号短整型网络字节顺序

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享