结构

CS结构

也就是我们最常见的客户端-服务器结构,现在使用最多的模式了,举个例子就是web程序,首先有个服务器存储了页面然后我们的客户端就是我们的PC去请求数据,获得数据之后显示在我们的浏览器。当客户端的请求变得频繁之后服务器就需要一个庞大的数据中心来保证许多客户端的请求

P2P

对等网络,对数据中心的依赖减少到最小或者不依赖。在这个结构中所有接入的主机被称为对等方,对等方需要受到服务中心的控制。我们使用最多的就是迅雷等软件下载种子了,文件在用户与用户之间发送而不需要服务器。
image.png

拓展性

P2P结构 的一大优点就是他的拓展性,任何用户都可以直接加入这个网络中,而且这个网络数据的传输不像客户端服务器结构在服务器带宽不足的时候受到限制。

BitTorrent

这就是典型的一种P2P协议。我们简单看下它是怎么运作的。在这里所有的主机集合叫做洪流,当你准备下载一个文件的时候就加入了一个洪流,然后你会获得洪流中一部分主机的IP,然后你就会试图和那些主机建立TCP连接,这些主机也就叫做邻居。当然这不是固定的,随着时间会有对等方退出也会有新的对等方来对你建立联建。这时候就显示了P2P的拓展性了。你在建立TCP连接之后会获得每个邻居的所拥有的所需文件文件块的一个列表,你就知道你需要的文件块在哪些邻居那里有。接下来就能从这些邻居那里拿到所用的文件块了,当然你不能只下载啊,你也需要上传让别的邻居从你这里下载到他们所需要的文件。其中有一种优化,就是你会首先请求你需要的文件块在所有邻居的文件块列表中中数量最少的那一个,这样最稀缺的资源就会变多那你的下载速度也就会变快了。

进程通信

进程区分

进程就是一个主机上面运行的一个程序,而网络通讯就是在多个不同的主机的程序中交换报文。首先我们需要一个客户端程序和一个服务器端程序,提供数据的就是服务器,接收的就是客户端,在P2P网络中一个程序既可以上传数据也会下载数据,它说明了一个程序既可以做客户端也可以做服务端。

套接字

程序通过套接字来发送和接收网络中报文,以前我总是不理解套接字是怎么传输数据的,看了书的一个比喻我才知道我的思路就是不对的,网络是分层的套接字只是应用层的他怎么能传输呢。他就像一个门然后将报文发送到门外或者从门外拿进来,传输就是下面的网络层的的作用了。其中套接字还是能对运输层造成影响对,他可以选择运输层对协议和缓存等配置。

SSL

TCP和UDP本身并没有提供加密,所有有人想出了SSL作为TCP等加强层,但是我们要知道SSL并不是在UDP和TCP同一层中再加了一层而是在应用层实现的。

HTTP

在应用层最有名的应该就是http协议了,http建立在TCP协议上。

报文格式

http分为请求报文和响应报文。
image.png

请求报文的第一行含有请求方法,就是我们常见的GET,POST等,后面带有请求等URL,比如/index.html,再后面跟着协议版本,现在最多等就是http1.1,也已经出现了http2.0等。后面几行就是首部行,每一行都由头部字段名称和值组成比如HOST:www.baidu.com.最后就是请求包,当GET时候实体就为空,POST就包含用户填写的表单。

image.png

响应报文第一行有版本,接着就是状态码如最常见的404,200等后面跟着状态码的描述。下面是响应头部,最下面就是返回的数据了
具体可以看这篇博客https://blog.csdn.net/holmofy/article/details/68492045

持续连接

在开始的时候http都是非持续连接的,当你请求网页上5张图片的时候就需要建立5个TCP连接,这大大的增加了服务器的压力,而且每次都进行三次握手也会影响速度。然后在http1.1推出了持续连接,在持续连接中服务器发送响应之后不关闭连接,后续的请求还是可以使用这个连接来发送请求。这里要注意,持续连接还是使用流水线模式的,是多个连接并发运行的,而不是只有一个TCP连接,然后一个请求结束了再开始下一个。

cookie

由于http本身是无状态的,我们并不知道这个请求是谁发起的,这时候就需要cookie来帮助我们,简单说一下就是在网页首次请求的时候在响应报文添加一个set-cookie的首部行比如set-cookie:1,那之后这网页的请求报文之中就会添加一个首部行cookie:1,这样我们就对主机进行识别

HTTP2.0

时代在进步,HTTP2.0解决了很多HTTP1.0的遗留问题。其中最重要的我觉得就是首部压缩和多路复用
具体讲下多路复用,在上面的HTTP1.1中使用了持续连接,但是一般流水线也是有TCP上限的,如果原本能建立10个TCP连接,这时候有一个连接占用了很久的时间之后,并发量就变成了9个TCP后续的请求可能就需要等待,而在HTTP2.0中这情况就会消失,在HTTP2.0中一次只有一个TCP连接,所有请求都在一个连接中发送和响应。
具体可以看下这博客https://www.jianshu.com/p/712eb3a65d33
但是这也有一个缺点就是当一个TCP连接产生丢包发生重传时就会影响所有请求原本影响一个TCP连接还有9个可以正常使用这时候就有QUIC协议了,在弱网的时候由于他是UDP协议所以不会有堵塞的操作,HTTP3.0就是以QUIC作为基础的。