C
指的是client(客户端软件),S
指的是Server(服务端软件)
,C/S架构
就是基于网络实现客户端与服务端通信的软件架构,能够实现服务端软件与客户端软件基于网络通信。
网络 = 物理链接介质 + 互联网协议 (之前真的理解了“网络”?)
计算机之间的通信标准,这个标准称之为互联网协议(Internet Protocol Suite),按照功能不同,人们将互联网协议分为 OSI七层
或 TCP/IP五层 或 四层
(只需要掌握TCP/IP五层协议
即可)。
互联网协议常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称
TCP/IP
。因为该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议)。
如图所示,最下面的一层是物理层/实体层(Physical Layer),最上面的一层叫做应用层(Application Layer)。越靠下越靠近硬件;越靠上越接近用户。
这些层叫什么名称不必细究,只需要明白互联网分为若干层,每一层都是为了完成一种功能。
为了实现这些功能,就需要大家都遵守共同的规则,即 "协议" (protocol)
,所有协议的总称叫做互联网协议,它们是互联网的核心。
高电压(1)
和低电压(0)
(电信号)0和1
没有任何意义,必须规定电信号多少位一组,每组什么意思以太网协议ethernet
(1)信号分组:ethernet
协议
以太网协议: 早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet
。
报头head
和数据data
两部分 18字节
。"数据"的长度,最短为46字节
,最长为1500字节
。 因此,整个"帧"最短为64字节,最长为1518字节
。如果数据很长,就必须分割成多个帧进行发送。(2)数据标识 :Mac地址
上面提到,以太网数据包的"标头",包含了发送者和接受者的信息。而发送者和接受者是通过网卡的地址来进行标识,这个地址也叫Mac地址
。
以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。
前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。
(3)数据传输:广播
ARP协议
知道另一块网卡的地址广播(broadcasting)
将数据包送到接收方
ethernet
采用最原始的方,广播的方式进行通信,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。这种发送方式就叫做**“广播”(broadcasting)**
上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。
有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。
有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网并非是单独的一个超大网络组成,而是由一个个彼此隔离的小的局域网组成的,也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。
由来:必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址
是无法区分的,它只跟厂商有关
功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址,简称**”网址“**。
"路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。
于是,"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。
习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0
一直到255.255.255.255
。
互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2
应该与172.16.254.1
处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。
对于IP地址172.16.254.1
,可以有以下分法:
172
;主机部分:16.254.1
172.16
;主机部分:254.1
172.16.254
;主机部分:1
这就要用到另一个参数"子网掩码"(subnet mask),所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
比如,IP地址172.16.254.1
,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000
,写成十进制就是255.255.255.0
。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
根据IP协议发送的数据,就叫做IP数据包。不难想象,其中必定包括IP地址信息:
不用修改以太网的规格,把IP数据包直接放进以太网数据包的"数据"部分,以太网数据包就变成了下面这样:
IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的"数据"部分,最长为65,515字节。
前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。
因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(后文会解释),但是我们不知道它的MAC地址。
所以,我们需要一种机制,能够从IP地址得到MAC地址。
这里又可以分成两种情况。
第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的**“网关”(gateway)**,让网关去处理。
第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。
总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序呢?答案就是端口(port),端口即应用程序与网卡关联的编号。
功能:建立端口到端口的通信
补充:端口范围0-65535
,0-1023
为系统占用端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。
只要确定主机和端口,我们就能实现程序之间的交流。
因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。
传输层有两种协议,TCP
和 UDP
:
TCP(Transmission Control Protocol
,传输控制协议)是可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
为什么tcp是可靠的数据传输呢?
最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。
TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来。
基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手?
因为建立链接时server端的ACK和SYN是一起发的,而断开时,为了保证数据的完整发送到client是分开发送的。
更多可以参考:TCP和UDP的区别
UDP(User Data Protocol
,用户数据报协议)是不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节
,正好放进一个IP数据包。
UDP,UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
更多可以参考:TCP和UDP的区别
TCP协议虽然安全性很高,但是网络开销大,而UDP协议虽然没有提供安全机制,但是网络开销小,在现在这个网络安全已经相对较高的情况下,为了保证传输的速率,我们一般还是会优先考虑UDP协议!
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。
套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。
具体用法可以看下图,或者点击:Python 网络编程(5):socket 介绍和使用案例
偶然发现一篇很硬核的文章:
一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
有空可以好好约阅读。
主要参考: