Linux网络编程基础

目录

一、网络发展历史和分层

1.1Internet的历史

1.2网络的体系结构

1.2.1OSI模型

1.2.2TCP/IP协议族

1.2.3各层典型协议

1.2.4网络的封包和拆包

二、网络编程的预备知识

2.1Socket

2.1.1概念

2.1.2类型

2.2IP地址

2.3端口号

2.4字节序


一、网络发展历史和分层

1.1Internet的历史

  • 1968年 6月提出"阿帕网 ",是Internet的最早雏形,采用NCP网络控制协议缺点是不能互联不同类型的计算机和不同类型的操作系统,且没有纠错功能

  • 1973年由Robert Kahn和Vinton Cerf两人合作为阿帕网开发了新的互联协议,1974年 12月两人正式发表第一份TCP协议详细说明但此协议在有数据包丢失时不能有效纠正

  • TCP协议分成两个不同的协议,自此TCP/IP协议诞生

    • 用来检测网络传输中差错 的传输控制协议TCP(可靠传输)

    • 专门负责对不同网络进行互联 的互联网协议IP不可靠传输

  • 1983年 阿帕网上停止使用NCP,互联网上的主机全部使用TCP/IP协议。TCP/IP协议成为Internet中的"世界语"

1.2网络的体系结构

网络的层次结构和每层所使用协议的集合,网络采用分层思想每一层 实现不同的功能,对上层的数据做透明传输每一层向上层提供服务,同时使用下层提供的服务

两类非常重要的体系结构:OSI和TCP/IP

1.2.1OSI模型

  • OSI模型相关的协议已经很少使用,但模型本身非常通用

  • OSI模型是一个理想化的模型,尚未有完整的实现

  • 共有七层

与linux系统对应的话,低层相当于内核,高层相当于应用层。

网络上与之有关的比如交换机,二层交换机(对应数据链路层)、三层交换机(对应网络层,偏软件)

1.2.2TCP/IP协议族

  • TCP/IP协议是Internet事实上的工业标准

  • 共有四层

  • 网络接口和物理层 (这一层有各式各样的硬件),主要是屏蔽硬件差异,然后为上层提供统一的接口(具体地比如net_device 结构体,网卡特性通过其中的成员来描述);
  • 传到上层网络层 后,主要是实现端到端的通信(跨机器、跨操作系统、跨区域),典型的比如IP协议;
  • 再往上,传输层会实现通信和数据的完整性,比如TCP可靠传输,UDP不可靠传输(是否可靠只是基于不同应用场景);
  • 最后应用层,是用户和网络之间的接口 ,负责提供具体的应用服务

1.2.3各层典型协议

1.网络接口和物理层

  • MAC地址:48位全球唯一,网络设备的身份标识(相当于设备的身份证号码

  • ARP/RARP:解析地址,比如IP地址---->MAC地址,MAC地址---->IP地址

  • PPP:拨号协议,从以前的电话线拨号连接发展到现在的无线(GPRS/3G/4G)

2.网络层

  • IP:Internet protocol(分为IPV4和IPV6),IPV4地址是192.168.7.246这种,IPV6地址则是十六进制的

  • ICMP:Internet控制管理协议,比如ping命令

  • IGMP:Internet分组管理协议,广播、组播

3.传输层

  • TCP:Transfer Control protocol传输控制协议,提供面向连接 的(建立虚拟连接),一对一的可靠数据传输的协议 (通过消耗一定资源来实现),这种可靠体现在数据无误数据无丢失数据无失序数据无重复到达

  • SCTP:TCP的增强版,能实现多主机、多链路通信

  • UDP:user Datagram protocol用户数据报/包协议,提供不可靠无连接的尽力传输协议 ,优点是不需要进行连接高效

4.应用层

  • 网页访问协议,HTTP/HTTPS

  • 邮件发送接收协议:POP3(收)/SMTP(发)、IMAP(可接收邮件的一部分)

  • 文件传输:FTP

  • 远程登录:Telnet(明文传输)/SSH(加密传输)

  • 嵌入式相关

    • NTP网络时钟协议

    • SNMP简单网络管理协议(实现对网络设备集中式管理)

    • RTP/RTSP传输音视频的协议(安防监控)

1.2.4网络的封包和拆包

以该图为例(左边server往右边client发送数据):发送方经过各层会加上包头进行封包,最终通过驱动发送到路由器,路由器中间可能会经过不同网络,最终发送给接收方,存入它的空间,读取这个数据包就是不断地拆包环节

相关的概念有:

  • MTU :Maximum Transmission Unit 最大传输单元,和网络类型相关,以太网标准1500字节,IPV61280字节

  • MSS :Maximum Segment Size 最大报文段大小基于MTU计算不含各种头部开销

二、网络编程的预备知识

2.1Socket

2.1.1概念

  • 是一个应用编程接口(介于应用空间和内核空间)

  • 一种特殊的文件描述符(可以read、write、close)

  • 网络编程的一种资源

  • 并不仅限于TCP/IP协议,面向连接----TCP/IP无连接----UDP和IPX

2.1.2类型

  • 流式 套接字(SOCK_STREAM),唯一对应TCP,内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制

  • 数据报 套接字(SOCK_DGRAM),唯一对应UDP,独立数据包形式发送

  • 原始套接字(SOCK_RAM),可跨过、穿透传输层,通过IP、ICMP直接访问

2.2IP地址

  • Internet中主机的标识 (要与别的机器通信必须具有一个IP地址)(相当于设备的住址,可以变动

  • 分为IPV4 (32位地址)和IPV6(128位地址),常用IPV4

  • mobile IPV6:local IP(本地注册的IP),roam IP(漫游IP)

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

  • IPV4地址表示形式:点分十进制形式----192.168.7.246、整数形式(省资源)

  • 特殊IP地址

IP地址转换函数如下:

cpp 复制代码
#include <arpa/inet.h>

//将点分十进制形式IP地址的字符串 转换为32位网络字节序整数
//仅用于IPV4,出错时返回-1,因此不能转换全网广播255.255.255.255的地址
in_addr_t inet_addr(const char *cp) 
cpp 复制代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//将点分十进制形式IP地址的字符串 转换为32位网络字节序整数
//IPV4和IPV6都可用,能正确处理全网广播的地址
int inet_pton(int af, const char *src, void *dst)
    
params: af----AF_INET或AF_INET6
    	src---源地址---点分十进制形式IP字符串
    	dst---转换结果地址---32位整数
    
return: 成功返回1 出错返回其他值
   
//和它反过来的,将32位整数转换为点分十进制形式IP地址字符串
//成功返回非空指针,失败返回NULL
const char *inet_ntop(int af, const void * src, char * dst, socklen_t size)    

2.3端口号

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

  • 16位的数字(1~65535)

  • 知名端口:1~1023(FTP:21、SSH:22、HTTP:80、HTTPS:469)

  • 保留端口:1024~5000

  • 可使用的端口:5000~65535

  • TCP端口和UDP端口是相互独立的(意味着即使端口号相同也不冲突)原因如下图:

网络通信是由IP地址+端口号来决定

2.4字节序

  • 不同的CPU访问内存中的**多字节数据(所以不包含字符串)**时,存在大小端问题

    • 小端 :低地址存低位数据,高地址存高位数据(个人简记为端),像x86/ARM一般都采用小端

    • 大端 :低地址存高位数据,高地址存低位数据(个人简记为端),像powerpc/mips都采用大端

  • 网络字节序采用大端模式

  • 字节序转换函数

    • 主机->网络:

      cpp 复制代码
      u_long htonl(u_long hostlong)    4字节
      u_short htons(u_short hostshort) 2字节
    • 网络->主机:

      cpp 复制代码
      u_long ntohl(u_long netlong)
      u_short ntohs(u_short netshort)

字节序转换函数一般用来转换端口号,IP地址的转换前面已有API

相关推荐
シ風箏1 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
Cachel wood3 小时前
Vue.js前端框架教程8:Vue消息提示ElMessage和ElMessageBox
linux·前端·javascript·vue.js·前端框架·ecmascript
PP东4 小时前
ES6学习Generator 函数(生成器)(八)
javascript·学习·es6
小屁不止是运维6 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
follycat7 小时前
bestphp‘s revenge
学习·web安全
柳鲲鹏7 小时前
jiangdg/AndroidCamera关闭摄像头流程
笔记
职业考试资料墙7 小时前
二级建造师考试题库及答案
学习·考试·题库
warrah8 小时前
k8s迁移——岁月云实战笔记
笔记·容器·kubernetes
黑客K-ing8 小时前
网络安全防范
linux·服务器·web安全
肖老师+8 小时前
“从零到一:揭秘操作系统的奇妙世界”【操作系统中断和异常】
操作系统