- 我最近开了几个专栏,诚信互三!
====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
====> |||《C#专栏》::记录我复习C#的经历,深度理解,查漏补缺,不定期更新。|||
====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||
计算机网络:应用层(一)
- 应用层要解决的问题
- 如何解决这些问题
- IP地址及端口初识
- 应用层协议
- socket初识(初次理解)
- TCP/UDP要提供的服务
- TCP/UDP初识
应用层要解决的问题
在之前的计网博客中,我们以及学习到了网络和基于ISO,TCP/IP的网络层状结构,其中我们了解到了应用层要解决的问题是两台主机之间进程与进程之间的通讯问题。
如何解决这些问题
- 首先,要解决进程之间的通讯问题,我们首先需要知道我们要与那个主机进行通讯。
- 其次就要解决我们要与该主机的那个进程进行通讯。
- 在次我们还要解决双方通讯所要遵守的规则,及协议。
IP地址及端口初识
要解决第一个问题,我们可以借助IP地址和端口,我们知道,IP地址表识了某个网络,这样我们就可以定位到接收方的网络位置,而进程则需要端口号来确认,一个主机上有多个进程,端口号是一个数字,来标识唯一的进程,这样我们就能定位到网络,同时定位到精确的进程了。
定位到网络并不能找到某一台主机,还需要MAC地址,而这部分不属于应用层的管辖,属于数据链路层。
http的默认端口号为80号。
应用层协议
所谓的协议是层与层之间传递信息的一个规则的集合,协议中包含了很多东西,入语法,语义,时序等,应用层的主要协议有http,https协议,https协议是http+ssl协议,TCP/UDP是明码发送的,所以https协议就是解决如何在TCP/UDP为上层提供的服务中保证安全性。
下图是http报文格式。
socket初识(初次理解)
在我们传输数据的时候,我们要确认一些东西,比如:我是谁,我的那个进程要发送信息,接收方是谁,接收方的那个进程要接收该信息。 再比如我需要运输层为应用层提供可靠传输还是非可靠传输(TCP/UDP)。 以及基于什么协议进行传输。
我们发现,如果每次发送消息/接收消息,我们都确认并发送一边 “我是谁,我的那个进程要发送信息,接收方是谁,接收方的那个进程要接收该信息。”这样的信息,首先会导致效率降低,并且对空间的利用也不够好,socket解决的这个问题。
- socket是被操作系统维护的一个表格,在需要可靠传输时(TCP),这个表格中包含了本地IP地址,本地端口号,接收方IP地址, 接收方端口号。这四个信息,在发送的时候,将这4个信息集合到一个整形中,并为四元组,发送出去,接收方同时也维护一个表格,来接收该四元组信息。
- 对于非可靠传输(UDP)socket维护的是一个二元组表格,该表格内存有本地IP地址,本地端口号。
通过socket,我们不用在发送多条信息,只需发送四元组/二元组,就能确定所有信息,同时对于TCP来说,只需要确定不同的接收方的端口号,就可以直接发送数据,这样就节约了时间,对于接收方也是如此,UDP只需要确定接收方的IP,和端口号,这样就将很多重复工作的时间节约了下来。
TCP/UDP要提供的服务
我们知道在计算机体系结构中,下层要为上层提供服务,TCP/UDP协议要为应用层提供基于运输层的可靠与否的服务。
TCP:可靠传输,基于TCP/IP协议。
UDP:非可靠传输。
它们互有优劣,选择什么服务需要由应用层的进程决定。
但是这两个协议都是明码传输的,这在某些情况下是十分危险的,要解决这个问题,需要应用层的协议ssl,ssl是一个库,它可以为数据提供安全的传输解决TCP/UDP无法安全传输的问题。
TCP/UDP初识
简单认识以下TCP/UDP协议。
TCP:是运输层提供可靠传输的协议,为了实现可靠传输基于TCP的运输层会做以下工作
- 1.TCP协议会检测当前信道的吞吐量,如果过高则TCP协议会减少发送的数据,保证数据的精确度。
- 2.在传输时,会保留副本,如果分组丢失了,则重发。
还有很多保证可靠传输的方法,这次简单认识下
UDP:是运输层提供非可靠传输的协议,由于是非可靠传输,所以对以上的要求都不高,入分组丢失不会重发,也不会保存分组,不会检测吞吐量,运输层数据接收速度与发送速度几乎相等等等。
这两种传输友好有坏,TCP提供可靠传输,用时间换取了数据的准确度,UDP则不会这样做。
比如流媒体,网络游戏等需要UDP提供服务,电子邮件等则需要TCP提供服务。