UNP-客户端服务端模型
Server-Client
一,客户端服务器模型

客户端与服务端沟通的具体过程:
- 客户端按照双方约定的格式来发送请求给服务端。这样,服务器可以理解
- 服务器收到这个请求,按照双方约定的格式解释它,并做出相应的操作,比如执行一个sql语句操作数据库
- 服务器完成处理,给客户端发送一个响应,比如发送一个HTML页面。
- 客户端收到响应并处理,比如将html页面解析并展示。
TCP与UDP区别其实很简单。TCP中的连接是谁发起的,UDP中的报文是谁发送的。
TCP中建立连接是一个非常重要的环节。
服务器端需要在一开始就监听在一个众所周知的端口上,等待客户端发送请求,一旦有客户端连接建立,服务器端就会消耗一定的计算机资源为它服务,服务器端是需要同时为成千上万的客户端服务的。
如何保证服务器端在数据量巨大的客户端访问时依然能维持效率和稳定,是我们学习UNP的目的。
注意:客户端和服务端是以进程为单位的。
二,IP和端口
网络世界中机器的地址,需要用IP表示。机器中进程要用端口来区分。
一个客户端服务端连接(套接字连接)可以用 (clientaddr:clientport, serveraddr: serverport)来表示。
2.1保留网段
在刚学网络时,我很纳闷,为啥我的电脑,同学的电脑,机房里的电脑,普遍的IP为10.0.x.x或者192.168.x.x这样的。
后来我明白了,国际标准组织在 IPv4 地址空间里面,专门划出了一些网段,这些网段不会用做公网上的 IP,而是仅仅保留作内部使用,我们把这些地址称作保留网段。

2.2子网掩码
需要理解的是,网络IP划分的时候,需要区分两个概念。
- 网络
- 主机
为什么会这样?直接给个地址不就行了,为什么要区分网络,还要区分主机?别急
很久很久以前,有子网(subnet)这一说法,在这里面,一个IPv4的第一个,前两个,或者前三个字节是属于网络的一部分。这就是A,B,C类网络。
网络地址位数由子网掩码(Netmask)决定,你可以将 IP 地址与子网掩码进行“位与”操作,就能得到网络的值。子网掩码一般看起来像是 255.255.255.0(二进制为 11111111.11111111.11111111.00000000),比如你的 IP 是 192.0.2.12,使用这个子网掩码时,你的网络就会是 192.0.2.12 与 255.255.255.0 所得到的值:192.0.2.0,192.0.2.0 就是这个网络的值。
子网掩码能接受任意个位,而不单纯是上面讨论的 8,16 或 24 个比特而已。所以你可以有一个子网掩码 255.255.255.252(二进制位 11111111.11111111.11111111.11111100),这个子网掩码能切出一个 30 个位的网络以及 2 个位的主机,这个网络最多有四台 host。为什么是 4 台 host 呢?因为变化的部分只有最后两位,所有的可能为 2 的 2 次方,即 4 台 host。
不过一大串的数字会有点不好用,比如像 255.192.0.0 这样的子网掩码,人们无法直观地知道有多少个 1,多少个 0,后来人们发明了新的办法,你只需要将一个斜线放在 IP 地址后面,接着用一个十进制的数字用以表示网络的位数,类似这样:192.0.2.12/30, 这样就很容易知道有 30 个 1, 2 个 0,所以主机个数为 4。
2.3 域名系统
记忆IP地址也太难了吧!所以前辈们发明了DNS!
数据包和字节流
尽管名称是 TCP/IP 协议栈,但是从上一讲关于 OSI 和 TCP/IP 协议栈的对比中,我们看到传输层其实是有两种协议的,一种是大家广为熟悉的 TCP, 而另一种就是 UDP。
TCP,又被叫做字节流套接字(Stream Socket),一般分别以“SOCK_STREAM”与“SOCK_DGRAM”分别来表示 TCP 和 UDP 套接字。
UDP 也可以做到更高的可靠性,只不过这种可靠性,需要应用程序进行设计处理,比如对报文进行编号,设计 Request-Ack 机制,再加上重传等,在一定程度上可以达到更为高可靠的 UDP 程序。当然,这种可靠性和 TCP 相比还是有一定的距离,不过也可以弥补实战中 UDP 的一些不足。

浙公网安备 33010602011771号