一、什么是互联网
一、什么是互联网
1、计算机网络的定义

2、计算机的分类
1)按照作用范围分类

个人局域网:热点
2)按照网络的使用者分类

公用网:缴费可以使用的网
专用网:军队
3、网络的网络

由节点和链组成

互联网:网络的网络



1)路由器也是计算机,但不是主机,传输数据是从主机到主机,但路由器是转发作用
2)什么是互联网

3)
边缘部分:主机
核心部分:广域网


4)边缘部分:主机-端系统
端系统有很大的区别,小的主机、摄像头,大的可能是昂贵的计算机

端系统的拥有者可以是个人、单位、isp
4、互联网基础结构发展的三个阶段

1)APPAnet
最初是分组交换


一个分组一个分组的发,最后在组装到一起
83年,TCP/IP协议以后,单个分组交换变成网络互联,90年APPnet结束
2)NSFnet

90年后,大型公司入驻,美国政府淡出运营
3)互联网服务提供者ISP
科研-收费公用

主干ISP全球有十几个:电信、移动、联通
地区ISP大概有十几万个
IXP:互联网交换点,方便地区ISP之间的交换
内容提供者:抖音、快手
需要服务器存放大量视频,需要庞大的网络,跟各级ISP相联,ISP越多,效率越高

4)万维网
信息的传递从文字到声音、视频

二、OSI七层体系结构
一、网络体系结构的形成
(一)计算机网络体系结构的形成
1、两个计算机之间通讯要解决很多问题

2、解决上述问题-提出了分层结构

74年,SNA-APPnet出现但是TCP/IP还没有出现

3、83年,ISO/OSI七层体系结构
此时TCP/IP还没有出现,ISO失败了
失败原因:90年代后,互联网的形成,时常被TCP/IP占领等


4、OSI变成了国际标准


(二)协议与划分层次
1、

1)语法:数据与控制信息
1+名字/2+内容
2)语义:何种控制信息
3)同步:发送之前同步发送内容,双方协调
2、协议的两种形式

3、复杂的计算机网络是层次式的

4、透明传输-QQ、微信传输
文件传输模块:文件大小、格式、名字-QQ/vx
通信服务模块:知道文件发给谁-地区信息-系统
网络接入模块:负责网络接口细节,向上层提供接入和通信服务-网络接口

5、各层需要完成的功能

1)差错控制:转发错误、数据错误
2)流量控制:发送和接收速率
3)分段和重装:下载进度条,下载完整合
4)复用与分用:
复用-一个东西被多个人使用
分用-一个人提供多个服务
tcp协议为不同应用服务是分用,不同应用服务使用同一个协议是复用
5)建立链接和释放:交换数据前后
6、计算机网络的体系结构

二、协议与划分层次
网络的体系结构:各层及其协议的构成
实现:遵循体系结构,用硬件和软件实现

三、OSI七层体系结构

1、除了互联网、局域网内部也可能会分层,局域网可能需要OSI模型
2、传输层/运输层
3、高层负责主机之间的数据传输,底层负责网络之间的数据传输
4、文件传输模块对应高层,通信模块和网络接口模块是底层
5、高层是本地,交给下层的数据或者怎样解析交付的数据,低层,交付的数据怎样发送出去,怎样接收数据交给高层。
6、高层

1)应用层:QQ可以聊天,抖音可以刷视频,浏览器可以浏览网页
2)表示层:QQ聊天的文字数据、抖音视频数据,接到数据后的表示
应用层处理数据,将数据变成视频,变成文字,下层数据越小传输效率越高,表示层就负责压缩和表示
3)会话层:本地的不同应用之间的通信
7、低层

1)传输层:负责数据的传输,上层应用把数据交给传输层,面对不同应用,对端口标注,不同应用对应不同端口
差错校验:端口号
2)网络层:标注不同网络的不同主机IP,从北京到上海,目的地和出发地相当于两个主机,可以寻址,如何将数据从一个IP传到另一个IP
差错校验:地址
3)数据链路层:从北京到上海,出门做那趟公交,每一段怎么走,建立数据传输的通道,管理节点之间或节点和路由器之间数据传输
差错校验
4)物理层:比特流,高低电平、频率
但是物理层还是软件层面的工作,物理传输是传输媒体的工作。物理层考虑怎样解释0和1。
三、TCP/IP协议与五层体系结构
一、TCP/IP协议族四层体系结构
1、tcp/ip和osi对等关系

2、

1)实际上TCP/IP实际只有三层,网络接口层没有内容,链路层使用的各种局域网标准由IEEE委员会下属工作组负责
2)路由器只参与数据转发,不参与数据处理

3)TCP/IP协议的改变

例:Ping命令
不需要传输层,只需要网络层协议
4)理念:网络的核心部分越简单越好,IP层只只负责主机到主机之间的地址

把IP封装好,可以支持多个运输层的协议,多个运输层的协议也可以支持多个应用层的协议,IP向下又支持多个网络,有线/无线
IP支持各种异构网络,只要实现IP,就可以介入互联网
二、五层体系结构

1、应用层-应用层之上是应用APP

1)应用完成特定的功能,定义的是应用进程通信和交互的功能
2)交互的是报文
3)协议:DNS,HTTP,SMTP
2、运输层-UDP/TCP
UDP:不可靠
TCP:可靠传输

进程间的通信-用户数据宝
差错:端口号的正确性
3、网络层
IP数据报-主机和主机之间

差错:IP地址的正确性
4、链路层-节点和节点之间

差错:比特差错
0010-0100

1)丢弃出错
2)可靠传输-检查出错
封装成帧
5、物理层

数字信号-模拟信号
6、服务器提供服务


四、IP地址与端口号
一、分类IP
(一)IP地址及其表示方法
1、ip地址
1)32位,4字节
2)点分十进制
3)示例
2、ip两级结构
1)ip是唯一的,但同一个局域网主机的ip可能相同,从同一个局域网发送信息被封装成一个ip
2)发送信息给主机,先发送对应ip到局域网,再从局域网通过其他技术分发到对应主机
3、ip的分类
1)
A:0~127-网络号占8位
B:128~191:网络号占16位
C:192~224:网络号占24位
D:224~
2)多归属主机:一个主机通过多个两个网卡连接两网络,该主机同时拥有两个ip地址
3)路由器:一个路由器至少有两个ip地址
4、一般不使用的特殊ip
1)0-0:本网络的本主机
2)0-X:本王网络主机号位X的主机,不是完整的ip地址
3)全1-全1:本网络广播,不通过路由器转发
4)Y-全1: 对网络号Y的网络上的所有主机进行广播
5)127-非全0或者全1的任何数:用于本地网络的巡回测试
6)全0或者全1都有特殊意义
5、ip分类的不足:
1)大地址块:
A:2的24次-2--- 1600万
B:2的16次-2---65533
C:2的8次-2---255
6、划分子网-解决地址浪费
(适用于B类)通过子网号,一个B类地址可以划分成多个,分给不同公司
二、无分类编址CIDR
1、斜线标记法
三、子网掩码
1、地址掩码
2、子网掩码的计算
地址掩码和ip地址按位相与
3、点分10进制的子网掩码计算
四、IPV6的表示方式
地球上的沙子都会有ip
1、0压缩
注意在任一地址中,0压缩只能使用1次
五、协议端口号
1、运输层的作用
屏蔽作用:
可靠信道和不可靠信道
2、运输层的两个协议-TCP/UDP
3、TCP/UDP的区别
4、运输层的端口
5、需要考虑的问题
1)进程的创建和撤销都是动态的,因此发送方无法识别其他及其上的进程
2)端口号
在网络传输中还需要ip地址,所以数据传输既需要ip地址,也需要端口号,端口号用于表示不同进程
0不能代表端口
端口号只具有本地意义,不同主机可以有相同的主机号
定位一个进程需要端口号和ip地址
6、协议端口号
常用的熟知端口
服务器的端口比较重要,是分用的
7、BSD端口规则
用户自定义5000以下的端口,有可能会和其他应用程序冲突
自定义范围建议:5000、8888
六、字节序以及IP地址转换
(一)主机字节序和 网络字节序
各个字节的存储顺序
实际运算是小端,符合计算规律
网络通信是大端,符合读字符
判断是大端还是小端的代码:
(二)字节序转换函数
(三)IP地址字节序转换函数
字符串转换成32位的数据
数据转换成字符串,支持IPv6
1.请简要总结网络字节序形成的原因,以及网络编程中对应的处理方法。
计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。为了避免不同类别主机之间在数据交换时由于对于字节序的不同而导致的差错,引入了网络字节序。
主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short);
网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
五、socket套接字及TCP实现框架

一、socket套接字
(一)socket套接字
1、本阶段的编程基于应用层的编程实现
2、体系结构:各层及其协议
实现:遵循体系结构,硬件或软件完成

3、常见的网络编程接口

4、socket套接字-抽象概念

socket在五层结构中上面是应用层,下面是传输层,由内核负责
socket用于实现各种功能
(二)socket常用API介绍(函数接口)
1、AIP


可以通过以上函数写中继程序代码
1)创建套接字-设置套接字类型-协议0
2)绑定通信结构体-通信结构体是IP地址和端口号-定位进程
3)3-4函数用于服务端
4)向服务端发起连接请求-用户端
2、三元组

这里的协议主要是TCP和UDP协议
和socket所在的层位置相关
3、绑定ip地址和端口号
通用地址族结构体


sa_family:
AF_UNIX:本地通信
需要文件地址
AF_INET:IPv4

AF_INET6:IPv6(基本不用)

因为绑定通信结构体不能区分本地还是网络,所以有一个通用,然后强制转化

addrlen参数:是用来统一不同的通信方式结构体宽度不同的问题(ipv4/ipv6)
3、网络编程的套接字

TCP/UDP/原始套接字
原始套接字可以访问底层协议
用ICMP实现ping命令

流和数据报套接字都不需要设置协议,一对一,原始套接字对网络层有多个协议可以选择
4、套接字也属于一种文件类型



(三)TCP通信的实现过程

(一)服务端

1、创建套接字只能用socket--返回的是大于0的整数,是一个文件描述符
2、bind:绑定函数,定义通信结构体,绑定到fd上(ip,端口号,协议)
3、listen:服务器函数,tcp服务器和客户端的区别,TCP服务器是一对多,需要建立连接,用队列管理元素
listen负责队列的长度

sockfd:套接字
backlock:长度
4、accept:真正实现通信,把客户端出队,生成newfd套接字,和客户端一对一连接,accept之后才能真正和客户端连接

处理客户端发来的信息,出队队列的地址信息

(二)客户端
1、connect

不需要socket
和绑定函数参数相同
函数总结:
1、int socket(int domain,int type,int protocol);
根据指定的地址族、数据类型和协议来分配一个套接字的描述字及其所用的资源的函数
domain:协议族/域:AF_INET(IPv4),AF_INET6(IPv6),AF_UNIX(本地)
type套接口类型:TCP协议、UDP协议、protocol:一般为0。
2、int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);绑定通信结构体,套接字绑定到一个ip,并制定一个端口号。
3、int listen(int sockfd,int backlog);监听套接字,使主动连接套接字变为被动连接套接字,使一个进程可以接收其他进程的请求。
典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1。
4、int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);处理客户端发起的连接,生成新的套接字,用于服务端,接收客户端的连接请求,成功返回一个sockfd为文件描述符,用于和客户端通信。
5、int connect(int sockfd,const struct sockaddr,socklen_t addrllen);向服务器发起连接请求
二、TCP通信的实现过程
六、TCP服务器的实现
一、TCP服务起的实现(理论)
(一)socket函数与通信域

1、socket函数


1)协议为0,流式对应唯一的TCP
2)通信地址族

(二)bind函数与通信结构体
通用地址族

1、 通信地址族和通信结构体的关系

2、强转

3、IPv4地址族-三元组

示例:

(三)listen函数和accept函数

backlog:任意函数
二、TCP服务器的实现代码
1、本地环回地址

2、服务端代码结果

空格两次因为buf缓冲区自带一次换行符
3、服务器代码


三、TCP服务器客户端代码
1、客户端的实现要在服务端打开的情况下

2、客户端代码


四、代码优化
1、ip,端口号用main传参的方式

2、三个参数分别是./server ip 端口号

3、优化结果

4、优化代码
client.c


server.c:



七、TCP并发实现
一、TCP多进程并发
1、关闭服务端客户端,先关客户端再关服务端,先关服务端再关客户端,会出现服务端仍然再使用,影响下次使用
解决办法:

2、使用父子进程循环创建并发进程

客户端代码不变,服务端代码:

2、accept接收客户端函数
1)定义两个变量

2)设置ip



3、把代码放到网络上运行
将目录下的所有文件上传到申请的服务器中

实现网络通信:

服务器本地测试:
注册端口号1024~49151
动态端口号49151~65535
服务器上的端口是注册端口号

二、僵尸进程处理
当客户端关闭,子进程结束,但服务端没有关闭,父进程没有回收子进程,会产生僵尸进程

解决:
增加信号机制
SIGCHID:子进程结束,通知父进程

sigaction信号函数



替换为signal函数

三、TCP并发多线程
代码:/net/server1.c

八、实现UDP通信
一、函数接口扩展与UDP通信实现流(一)write/read到send/recv


前三个参数:send和read相同,recv和write相同

MSG_PEEK:123读走,下次还是123

(二)sendto与recvfrom

struct sockaddr *arc_addr:
recvfrom:相当于把接收到的客户端的信息放到了结构体内。
sendto:发送到通讯结构体指定的套接字中
(三)UDP通信的实现过程

1、置空函数
bzero();
头文件:#include<strings.h>

2、atoi:将数字字符串转换成整数
'8888'->8888
3、htons:网络字节序和主机字节序的转化
4、inet_aton:将点分十进制的字符串转换成一个32位的网路字节序的二进制
5、如果需要缓冲区,缓冲区是需要定义的

BUFSIZ:8192
二、UDP服务器代码



三、UDP客户端代码
服务端客户端通信:
关闭客服端重启,服务端依旧可以收到(和tcp不同)

客户端代码:


九、TCP是如何实现可靠传输的
个功能
URG:紧急指针,置1有效,有一个紧急数据/命令
ACK:确认号,ACK为1,确认号有效
PSH:数据传完了,可以交付给应用,再确认信息中,客户端接收到服务端的缓冲区将满,催促服务端刷新缓冲区
RST:TCP通信过程中发生错误,置1中断
SYN:置1,发起一个连接请求,三次握手
FIN:置1,断开连接,四次挥手
8)紧急指针:紧急数据写到最前
面,紧急数据从哪结束,紧急指针是结束位置
9)窗口:窗口的大小,一次性发送数据的大小
10)检验和:检验TCP数据包的数据是否正确,没有问题交给应用,链路层检验的是bit位,网络层只检验包头,运输层检验整个数据包,以2字节进行计算,和链路层双保险,简单检验。
八股文:csdn-TCP协议中可靠传输的原理
十、TCP连接管理与UDP协议
一、三次握手
1、序号:seq
确认号:ack
2、连接建立-三次握手

三次握手可以避免:A发送一次,由于没有收到ACK,重新发送,导致B收到重复的报文
3、三次握手的过程
1)服务端创建序列打开

2)客户端发送连接请求报文段
SYN:请求连接


SYN置1,不携带数据,弹药消耗一个序号
3)服务器回应

seq:服务器的序号是y
ack=x+1

y也被消耗1
4)客户端发送

下次发送数据从y+1开始

ACK:一个信号
ack:数据序号
建立连接:
避免SYN请求再次发送

二、四次挥手
1、通讯结束后,通讯双方都可以发起释放连接
2、四次挥手过程
1)第一次回收
tcp不携带数据也会消耗一个u

2)二次挥手

3)三次挥手
A处于关闭状态,没有数据要再次发送,C处于半关闭状态,可能有数据还未发送

4)四次挥手
A收到报文后发送一个确认
确认重传

四次挥手,中间的两次有可能会合并,C发送的数据只有几个字节,有可能和二次挥手一起发完
3、定时器

MSL:最大报文生存周期,C的第二次,没有收到第四次确认,可能重传第三次
2MSL:发送第四次后,C没有接收到,2MSL周期内没有冲床,说明第四次没有问题,第四次重传时间也不会超过2MSL
4、保活计时器

2小时内没有发送客户信息,发送探测报文,没有相应,客户端出现故障,终止连接
三、wireshark介绍
1、运行抓包工具wireshark
sudo wireshark
2、设置抓包内容为icmp

3、ping虚拟机抓包

正好四次:

四、wireshark抓包实验
1、虚拟机巡回抓包不会显示,因为数据不过网卡,只有过网卡的数据才会有显示。
2、https的端口号是443,用的是tcp协议,访问自己的端口号小于1024,需要加sudo
3、连接百度,抓包

4、三次握手


5、四挥手

五、UDP协议

1)无连接
2)不保证可靠交付
3)面向报文,UDP一次交付一个完整的报文
4)没有拥塞控制
5)一对一,一对多,多对多
6)首部开销小,只有8个字节

发送和接收都是一个报文

长度:UDP数据报的长度
检验和:检验数据包的正确性
伪首部:UDP长度和长度相同
十一、IP协议与ethernet协议
一、IP包头-IP数据报的首部格式
(一)IP协议作用和意义

1、链路层-IEEE802组织
2、互联网络

1)路由实现的是ip协议,加路由转发协议等
2)无论是有线还是无线传输,都需要用到ip网
3、透明传输/互联网

TCP/ip的一个含义:运输层和网络层

卫星传输数据,路由接收

(二)IP数据包首部格式

1、版本:一般是IPv4
2、首部长度:4字节*5最少20字节
有可选字段
3、区分服务:优先级

一般情况不使用,使用时才起作用
4、总长度:16位,0~65525
5、标识:16位,随机数,相同的标识是一组
标志:3bit,目前只用了2位

MF:MF = 1,后面还有分片
MF = 0,最后一个分片
DF(最低位):DF=0允许分片
片偏移:8个字节为偏移单位

7、生存时间:

有些数据不能到达目的地,会在路由之间游走,生存时间可通过路由器数量,最大255,每跳一次减一
8、协议:交付或者接收是标记TCP/UDP或者其他协议

9、首部检验和:只检验首部
10、协议字段指出将数据部分交给哪一个进程

11、ip协议的子协议:ICMP、IGMP
(三)IP数据报分片
1、为什么要分片:在网络中传输,路由器转化数据,但是路由器没有
主机内存大,CPU高,所以内存要更高效的利用
2、MTU是ip数据报的最大长度-1500
3、ip分片

最大数据段是1400

二、以太网包头-链路层协议

1、广播信道-以太网

2、以太网的MAC帧

链路层数据长度最大是1518,MTU1500+目标、源、类型、FCS
最小是64字节

FCS内有CRC算法,循环冗余校验
3、

帧的长度不是整数个字节:由物理层提交,不能多bit
以太网不负责重传丢弃的帧
十二、UNIX域套接字
一、UNIX域套接字理论
(一)流式套接字

只需要套接字文件的路径,不需要ip和端口


(二)域套接字

二、UNIX域流式套接字实现
man bind:示例代码
server代码:




客户端:

实现代码:

三、UNI域数据报套接字实现
1、写入代码

