本节主要内容:
1. 协议的概念
2. b/s, c/s
b/s即browser/server体系结构,即浏览器/服务器端,如购物网站等
c/s即client/server体系结构,即客户端/服务器端,需要提前下载客户端,如现在用的很多软件,都是c/s模式
c/s 优点 1. 协议选用灵活 2. 数据可以提前缓存
缺点 1. 对用户安全构成威胁 2. 开发工作量大,调试困难
b/s 优点 1. 2. 3. 跨平台
缺点 1. http
3. 分层模型 7 4
计算机网络体系结构
七层模型口诀:物数网传会表应
4. 协议格式
数据包格式
在两个PC之间进行通信时,如果直接将所传输的内容丢到网络中即会导致另一个PC无法收到相应的数据,因此在进行通信之前,要对所传内容进行封装
在数据进行传输之前,需要一层一层对数据进行封装;在接收数据之前,需要一层一层对数据进行解封装,这两个过程都是操作系统完成的
因此刚刚封装好了的数据其实是需要分区的
数据要进行传输,必须进行封装
要清楚的一点是,数据一定是从网卡传输出去的,网卡要连接到你的网络,中途可能会通过很多个路由器。
通信过程
两台计算机通过TCP/IP协议通讯的过程如下:
当数据要在两个主机之间进行通信时,两个PC可能是位于不同网络之中,因此就需要依靠路由器来进行网络的传输,如下图所示
如上图所示,假如已经封装好的数据包需要从A主机传输到B主机,那么就需要通过很多个路由器,在这么多条可行路径中,依靠路由表来进行选路。
并且一旦主机A到主机B的路径已经建立好了,后续就会一直按照这个路径进行传输
例如:假如这里需要传输一本小说,其肯定是由很多个封装好的数据包组成的,当连接一旦建立后,后续的数据包就不需要再通过选路了,这就是TCP稳定的原因,因为其通过的路由器都是固定的。
在传输过程中,路由器寻路的依据:目的主机的IP无疑是一个很大的依据,但是其就是单纯依靠这样一个IP吗?显然不是的,还有一个重要依据,就是我们下面所要讲的以太网格式帧
以太网格式帧
首先介绍一下以太格式帧
由上图可以知道,以太网格式帧由6个字节的目的地址和源地址组成,特别注意,这里的目的地址和源地址是指网卡的硬件地址而不是IP地址,类型描述了上一层所使用的协议,是TCP还是什么协议,由于我们之前知道数据链路层主要是用来校验的,因此最后就是CRC是用来校验的
我们在linux系统中输入ifconfig中第一行就可以看到MAC地址,这个网卡是唯一的
那么当主机之间进行通信时,每个主机有其自己的MAC地址,路由器也有其自己的MAC地址,相互连通的物理设备之间怎么可以获取对方的MAC地址呢,这就是我们接下来要讲的ARP协议
ARP协议主要就是用来请求下一跳的MAC地址
由上可以看出,ARP占用的是最小字节,PAD表示填充
ARP数据报格式如下
对此我们进行如下解释
当刚开始的时候,主机像连接的路由发送ARP请求,由于目的MAC未知,因此将其填充为0,目的端IP也是知道的
然后进行ARP广播,与主机相连接的每一个物理设备都会受到这条信息,并且将接收端IP与自己的IP进行比较,若相同,则将自己的MAC地址进行填充,如上述过程所示。每个路由称为一跳。
整个传输过程简述
每个路由器只进行了部分解封装,即解封装链路层和网络层,根据路由表来进行选路
最长的箭头表示PC之间的通信,中间的小箭头表示路由器之间的通信。
ARP数据:用来获取下一跳的MAC地址
TTL:一跳单位,每经过一个路由器TTL-1,最长为56
ARPCs数据包格式
IP段格式
我们常见的IP地址如192.168.0.222--字符串格式
在编程过程中需要将其转化为数值(unsigned int)类型
IP段格式对应MAC地址的数据段
TCP/UDP
传输层常见协议:tcp/udp
5. NAT映射 打洞机制
对于不同设备之间的通信,可以分为以下三类
公-公:设备之间直接进行通信
私-公:借助NAT映射表
私-私:借助NAT映射表和打洞机制,实现两者之间的直接通信。
6. 套接字
一、预备知识
利用socket可以唯一地找到一个进程
socket是linux文件的一个类型,伪文件(不占用实际地址)
其是一个全双工的,写入的同时也可以读出,能够实现双向通信而不导致写入的数据将读取的数据覆盖掉,socket采用的机制是:利用两个缓冲区,一个缓冲区用来读取,一个缓冲区用来写入。
socket总结
1. socket一般成对出现
2. socket需要绑定IP+端口号
3. 其具有两个缓冲区,一个读入,一个写出
- 网络字节序传输
1. 存储方法:
主机采用小端法存储(低字节存低位,高字节存高位)
网络字节流采用大端法存储(低字节存高位,高字节存低位)
当在网络中进行发送数据时,由于需要不断的解包得到MAC地址和IP地址,但是主机和网络字节流采用的存储方法不同,那么怎么解决这个问题呢?
因此需要做网络字节序和主机字节序之间的转换。
2. sockaddr数据结构
原始数据结构是struct sockaddr,后来变成了struct sockaddr_in
struct sockaddr_in内部成员
主要的三个
addr.sin_family=AF_INET/AFINET6;
addr.sin_port=htons/ntohs;
addr.sin_addr.s_addr=htonl/ntohl;
3. socket中实现C/S常用函数
一共三个函数需要强转:bind(), accept(),connect()
(1)socket():目的:创建套接字
int socket(int domain, int types, int protocal)
types:常见的有两种,TCP/UDP
成功,返回指向新创建的socket文件描述符,失败返回-1
(2)bind函数
sockfd:文件描述符,就是刚刚socket函数返回的值
第二个参数:由于Bind是要绑定IP和端口号,这个IP和端口号都放在sockaddr_i这个结构体中
(3)listen():指定监听上限数,即同时允许多少客户端和其建立连接
即:排队建立3次握手队列和刚刚建立三次握手队列的链接数和
(4)accept()作用:接受函数,接受,在socket的基础上接受一个连接
*addr:客户端的addr
*addrlen:客户端的addr的长度,注意在实际上进行传值的时候,不能用sizeof(),因为其是传入传出函数
和客户端发送数据读取数据都是通过返回的新的文件描述符来进行的,重点是返回值的理解
accept返回的才是跟客户端简历连接的
(5)connect():建立连接
7. TCP C/S模型
说明:
1. 服务器端是必须要用bind()函数来进行IP地址和端口号的绑定的,但是客户端不需要调用bind()函数,因为当不调用Bind()函数时,会自动给socket分配一个IP和端口号,但是服务器不绑定的话,语法上是没有问题的,但服务器总是变会出问题