【Internet历史】

1969年,阿帕网(arpanet)诞生;
1971年,电子邮件出现;
1973年,第一个跨大西洋的连接和电子邮件普及;
1974年,TCP/IP诞生;
1977年,电脑上出现了调制解调器;
1979年,出现了多角色游戏;
1983年,TCP/IP转正;
1984年,主机数超过了1000台,域名系统出现;
1987年,互联网上主机超过了3万台;
1990年,万维网协议诞生;
1991年,第一个网页诞生;
1995年,互联网商业化;
1998年,google诞生;
2004年,web2.0出现;
2008年,移动互联网;
2015年,物联网,虚拟现实;
2019年,5G;

【网络体系结构】

网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。
每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务。
网络体系结构:指网络的层次结构和每层所使用协议的集合。
两类非常重要的体系结构:OSI与TCP/IP

【OSI模型】

理论中的理想模型 7层

物理层:

传输的是bit流,物理信号,没有格式

链路层:

格式变为帧

网络层:

路由器中是有算法的,ip,(主机到主机)

传输层:

端口号,数据传输到具体哪个进程程序 (端到端)

会话层:

通信管理,负责建立或者断开通信连接

表示层:

确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据加密,解密

应用层:

指定特定应用的协议,文件传输,文件管理,电子邮件等。

注意:

OSI模型是理想化模型,目前尚未进行完整的实现

【TCP/IP网络模型】4层

  1. **应用层:**TFTPHTTPSNMPFTPSMTPDNSTelnet<br /> **传输层:**TCPUDP<br /> **网络层:**IPICMPRIPOSPFBGPIGMP<br /> **网络接口与物理层:**SLIPCSLIPPPPARPRARPMTU ISO2110IEEE802.1,EEE802.2

ARP/RARP:地址解析协议
标识主机的唯一地址:MAC地址

ARP:IP地址 -> MAC地址
RARP:MAC地址 -> IP地址
PPP:拨号协议(GPRS,4G)
IP:路由控制
IGMP:分组管理协议,广播、组播的控制
ICMP:控制管理协议
TCP:面向传输协议,提供面向连接、一对一的靠数据传输协议,数据传输无丢失、有序,数据无重复
UDP:面向无连接,由数据白提供不可靠、无连接的数据,传输过程中可能会出现数据丢失、无序以及重复传输现象
SCTP:传输层协议,相当于TCP协议的增强版,可以实现多主机、多链路通信

TFTP:文件传输服务
Http:超文本传输协议
HTTPS:数据加密
SMTP:邮件传输协议,发送
POP:邮件接收
IMAP:接收邮件一部分

【数据的封包和拆包】见笔记图片

MTU:maximum transmit unit:最大传输单元,指的是由物理接口提供给上层最大一次传输数据的大小
MSS:maximum segment size:最大报文长度
注意:当IP层有 <=1500字节数据需要发送,一次发送结束,如果 >1500,需要多次,但是多次传输的数据IP头一样

【socket】套接字

1.套接字是一个应用编程接口,是一种特殊的文件描述符
2.socket是网络编程里的一种资源
3.socket的类型:
流式套接字(SOCK_STREAM),使用这种模式选择传输层协议为TCP协议
数据报套接字(SOCK_DGRAM),选择UDP
原始套接字(SOCK_RAM),对应多个协议,直接跳过传输层,访问IP层

【IP】

IP地址:主机在internet上的唯一标识
192.168.8.151 局域网IP
113.120.15.3 访问外网IP

IP地址分类:
IPV4:32位IP地址
表示方式:点分十进制
192.168.8.151 -> 1100 0000 1010 1000 0000 1000 1001 0111

IPV4地址分类:A\B\C\D\E
每一个由网络号+主机号组成,网络号是判断主机在哪一个网络下,主机号则是判断主机在当前网络下的哪一个位置,二者是主从关系
A类:
第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为0;
0.0.0.0 - 127.255.255.255
A类地址常用于大型网络
B类:
高位2字节是网络地址,后面2字节是主机号
1000 0000 0000 0000 0000
128.0.0.0 - 191.255.255.255
B类地址常用于中型网络
C类:
192.0.0.0 - 223.255.255.255、
C类用于局域网或者小型网络
D类:
224.0.0.0 - 239.255.255.255
D类一般用作组播地址
E类:
保留
网络概念:
局域网可以理解为是一个小型网络;
若干个小型网络组合在一起可以组合成大型网络 => 以太网Inetnet
注意:
IP地址主机号全为0或者全为1的都不能分配给主机,属于特殊地址
全为0表示网络号全为1表示广播地址
192.168.8.0 192.168.8.255

当前网段最多可以给多少数据分配IP?
254

【子网掩码】划分子网

子网掩码:是一个32位的整数,作用是将某一个IP划分成网络地址和主机地址;
目的是合理的利用IP资源;
子网掩码特征:网络号全为1.主机号全为0
A类:
子网掩码: 255.0.0.0
B类:
子网掩码: 255.255.0.0
C类:
子网掩码: 255.255.255.0

把192.168.8网段分成四组:
192.168.8.
1100 0000 1010 1000 0000 1000 0000 0000
1111 1111

通过自定义子网掩码把二级ip整合为3级IP
2级:网络号+主机号
3级:网络号+子网号+主机号

划分成四组,将主机号高2位设置为子网号,子网掩码:255.255.255.192
子网1:1100 0000 1010 1000 0000 1000 00:
192.168.8.0-192.168.8.63 64 可用62
子网2:1100 0000 1010 1000 0000 1000 01
192.168.8.64-192.168.8.127
子网3:1100 0000 1010 1000 0000 1000 10
192.168.8.128-192.168.8.191
子网4:1100 0000 1010 1000 0000 1000 11
192.168.8.192-192.168.8.255

如何通过子网掩码获取当前IP的网络号和主机号

网络号=IP&子网掩码
主机号=IP&(~子网掩码)

IPV6:128位
表示形式:冒分表示法:
fe80 : : fcfc : a595 : d99f : bcad
冒号之间都有4个16进制数,一组IPV6地址由8组分隔组成
::之间省略了0
注意:在同一组地址里,只能有一个 ::
fe80 : : fcfc : a595 : 0000 : d99f

【端口号】

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

众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151 (1024-5000一般作为保留端口号,不建议使用)
动态或私有端口:49152~65535

比喻:
如果把网络数据包的投递过程看成是给远方的一位朋友寄一封信,那么:
IP地址就是这位朋友的所在位置,如上海交大XX系,邮局依靠此信息进行信件的投递,网络数据则依靠IP地址信息进行路由
端口号就是这位朋友的名字,传达室依靠这个信息最终把这封信交付给这位收信者,数据包则依靠端口号送达给接收进程

【字节序】

  1. 指的是不同类型的CPU的主机中,内存存储多字节整数序列的方法

大小端:

  1. **大端存储:**高字节存储在低地址位置,低字节存储在高地址<br /> **小端:**高字节存储在高地址位置,低字节存储在低地址

验证大小端问题:

1.共用体

  1. union<br /> {<br /> int a = 0x12345678;<br /> char b;<br /> };<br /> printf("%d\n",b);

2.强制类型转换

  1. int a = 0x12345678;<br /> char *p = (char *)(&a);<br /> printf("%d\n",*p);<br /> <br />在进行网络通信时,本机字节序的数据需要上传到网上按照**网络字节序**的形式存储,或者主机字节序的端口号和IP需要转换成**网络字节序**的形式进行存储,所以我们需要用到字节序转换函数

相关字节序转换函数:

inet_addr()

由主机字节序转化为网络字节序(大端),返回转换后的地址。
in_addr_t inet_addr(const char *strptr);
192.168.8.115

inet_ntoa()

将32位网络字节序二进制地址转换成点分十进制的字符串。
char *inet_ntoa(struct in_addr inaddr);

主机字节序到网络字节序

u_long htonl (u_long hostlong);8888
u_short htons (u_short short);

网络字节序到主机字节序

u_long ntohl (u_long hostlong);
u_short ntohs (u_short short); //short 2字节

atoi():将字符串形式的数据转化成整型


TCP和UDP的优缺点:

共同点:

同为传输层协议

不同点:

TCP:有连接,可靠
UDP:无连接,不保证可靠

MSN/QQ使用的传输层协议?

TCP特点:

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

适用情况:

适合于对传输质量要求较高,以及传输大量数据的通信。
在需要可靠数据传输的场合,通常使用TCP协议
MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

UDP特点:

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

适用情况:

发送小尺寸数据(如对DNS服务器进行IP地址查询时)
在接收到数据,给出应答较困难的网络中使用UDP(如:无线网络)
适合于广播/组播式通信中。
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
*

【TCP编程】

服务器搭建流程:

1.socket():生成一个套接字文件描述符用于和客户端连接
2.bind():用于绑定服务器端口号和IP地址
3.listen():监听,把套接字的主动属性转化为被动
4.accept():接收客户端的连接请求,成功返回一个文件描述符用于通信
5.recv()/send():数据收发
6.close():关闭套接字

函数描述

1.socket();

头文件:

include / See NOTES /
#include

原型:

int socket(int domain, int type, int protocol);

功能:

产生套接字 文件描述符用于建立连接或者通信

参数:

  1. **domain:**协议族<br /> **AF_UNIX/AF_LOCAL:**本地通信<br /> **AF_INET:**ipv4通信<br /> **AF_INET6:**ipv6通信<br /> **type:**套接字类型<br /> **SOCK_STREAM:**流式套接字:TCP<br /> **SOCK_DGRAM:**数据报套接字:UDP<br /> **SOCK_RAM:**原始套接字<br /> **protocol:**选择协议,默认填0,自动匹配

返回值:

成功:返回套接字
失败:返回-1

2.bind()

功能:

用于绑定服务器端口号和IP地址

原型:

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

参数:

sockfd:socket()产生的套接字
addr:指向存放IP地址和端口号结构体的指针
addrlen:地址结构体变量的长度

返回值:

成功:返回0
失败:返回-1

注意:

  1. struct sockaddr是一个通用结构体,我们不用,我们用<br /> ipv4专门的结构体<br /> <br /> IPV4地址结构体:<br /> struct sockaddr_in {<br /> unsigned short sin_family; //协议IPv4,2个字节 <br /> unsigned short sin_port; //端口号 ,2个字节 <br /> struct in_addr sin_addr; <br /> struct in_addr {<br /> __be32 s_addr; //IP地址,4个字节 <br /> };<br /> /* Pad to size of `struct sockaddr'. */<br /> unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -<br /> sizeof(unsigned short int) - sizeof(struct in_addr)];<br /> //8个字节<br /> };

3.listen():

功能:

监听,化主动为被动

原型:

int listen(int sockfd, int backlog);

参数:

sockfd:套接字
backlog:同时能处理的最大连接要求

返回值:

成功:返回0
失败:返回-1

4.accept():

功能:

处理客户端的连接请求

原型:

int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);

参数:

sockfd:套接字
addr:存放客户端信息的地址结构体指针
addrlen:地址结构体长度指针

返回值:

成功:返回用于通信的文件描述符
失败:返回-1;

注意:

当我们不关注是哪个客户端发来的连接请求时,第2,3参数写NULL

5.recv()

功能:

接收消息

原型:

ssize_t recv(int sockfd, void *buf, size_t len, int flags)

参数:

sockfd:通信套接字
buf:存放数据的数组
len:每次计划接收数据的长度
flags:填0和read()作用一样
MSG_DONTWAIT:非阻塞

返回值:

>0:实际接收的数据的长度
==0:客户端退出
<0:失败