网络编程
网络编程
CS架构与BS架构
Client<===========>Server
'''
客户端软件send 服务端软件recv
操作系统 操作系统
计算机硬件<====物理介质=====>计算机硬件
'''
Browser<===========>Server
'''
浏览器 <=========> 服务器
'''
网络通信
网络存在的意义就是跨地域数据传输=》称之为通信
网络=物理链接介质+互联网通信协议
OSI七层协议
协议:规定数据的组织格式
格式:头部+数据部分
封包裹的过程:数据外加头
拆包裹的过程:拆掉头获取数据
OSI七层协议数据传输的封包与解包过程
五层协议
'''
计算机1: 计算机2:
应用层 应用层
传输层 传输层
网络层 网络层
数据链路层 数据链路层
物理层 <======================> 物理层
01010101010
(源mac地址,目标mac地址)(源ip地址,目标ip地址)数据
'''
物理层负责发送电信号
'''
一组物理层数据称之为:位
单纯的电信号毫无意义,必须对其进行分组
'''
数据链路层:ethernet以太网协议
'''
规定1:一组数据称之为一个数据帧
规定2:数据帧分成两部分=》头+数据
头包含:源地址与目标地址,该地址是mac地址
数据包含:包含的是网络层发过来的整体的内容
规定3:规定但凡接入互联网的主机必须有一块网卡,每块网卡在出厂时都烧制好一个全世界独一无二的地址,该地址称之为mac地址
注意:计算机通信基本靠吼,即以太网协议的工作方式是广播
'''
网络层:IP协议
'''
要达到的目的:
划分广播域
每一个广播域但凡要接通外部,一定要有一个网关帮内部的计算机转发包到公网
网关与外界通信走的是路由协议
规定1:一组数据称之为一个数据包
规定2:数据帧分成两部分=》头+数据
头包含:源地址与目标地址,该地址是IP地址
数据包含的:传输层发过来的整体的内容
ipv4地址:
8bit.8bit.8bit.8bit
0.0.0.0
255.255.255.255
子网掩码:
8bit.8bit.8bit.8bit
255.255.255.0对应的二进制表达
11111111.11111111.11111111.00000000
一个合法的ipv4地址组成部分=ip地址/子网掩码地址
172.16.10.1/255.255.255.0
172.16.10.1/24
计算机1:
172.16.10.1: 10101100.00010000.00001010.000000001
255255.255.255.0: 11111111.11111111.11111111.000000000
通过ip地址+mac地址算出计算机1的网段地址
172.16.10.0: 10101100.00010000.00001010.000000000
计算机2:
172.16.10.2: 10101100.00010000.00001010.000000010
255.255.255.255.0: 11111111.11111111.11111111.000000000
通过ip地址+mac地址算出计算机2的网段地址
172.16.10.0: 10101100.00010000.00001010.000000000
计算机1: 计算机2:
应用层 应用层
传输层 传输层
网络层 网络层
数据链路层 数据链路层
物理层 <=========二层交互机========> 物理层
0101010101010
(源mac地址,xxxx)(源ip地址,目标ip地址)数据
(源mac地址,网关的mac地址)(172.16.10.10/24,101.100.200.11/10)数据
事先知道的是对方的ip地址
但是计算机的底层通信是基于ethernet以太网协议的mac地址通信
ARP:
所以必须能够将ip地址解析成mac地址
'''
计算机在同一局域网以及不同局域网内的通信方式
'''
# 两台计算机在同一个局域网内
计算机1:172.16.10.10/24 直接 计算机2:172.16.10.11/24
ARP:
自己的ip,对方的ip
1、计算二者网络地址,如果一样,拿到计算机2的mac地址就可以了
2、发送广播包
发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据
# 两台计算机不在同一个局域网内
计算机1:172.16.10.10/24 网关 计算机2:101.100.200.11/10
ARP:
自己的ip,对方的ip
1、计算机二者网络地址,如果不一样,应该拿到网关的mac地址
2、发送广播包
发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.1/24 数据
'''
总结
'''
ip地址+mac地址=》标识全世界范围内独一无二的一台计算机
或者:
ip地址=》标识全世界范围内独一无二的一台计算机
'''
网络通信——传输层
- 传输层功能:建立端口到端口的通信
- 补充:端口范围0-65535,其中0-1023为系统占用端口,自定义时不推荐去使用0-1023这个范围内的端口
tcp协议
- 可靠传输(开辟双向通道传输),TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
udp协议
- 不可靠传输(只负责传,不管对方受否能接收到),”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
tcp报文
tcp三次握手和四次挥手(SYN=1 ACK=1)
- 三次握手
- 客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。
- 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
- 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。 从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。
- 第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。
经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。
每次都是接收到数据包的一方可以得到一些结论,发送的一方其实没有任何头绪。我虽然有发包的动作,但是我怎么知道我有没有发出去,而对方有没有接收到呢?
而从上面的过程可以看到,最少是需要三次握手过程的。两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论。其实每次收到网络包的一方至少是可以得到:对方的发送、我方的接收是正常的。而每一步都是有关联的,下一次的“响应”是由于第一次的“请求”触发,因此每次握手其实是可以得到额外的结论的。比如第三次握手时,服务端收到数据包,表明看服务端只能得到客户端的发送能力、服务端的接收能力是正常的,但是结合第二次,说明服务端在第二次发送的响应包,客户端接收到了,并且作出了响应,从而得到额外的结论:客户端的接收、服务端的发送是正常的。
'''
建立客户端与服务器端之间的双向通路需要进行三次握手。
1、客户端向服务器端发送SYN报文,请求建立连接,此时客户端就处于 SYN_SENT 状态
2、服务器监测并接收客户端的SYN报文后返回一个ACK给客户端表示确认并且也向客户端
发起建立连接请求的SYN报文,此时服务器端就会处于 SYN_RCVD 状态
3、客户端接收到服务器返回来的响应之后就会变成 ESTABLASHED 状态表示客户端到服
务器端的通道建立成功,之后接收到服务器端传过来的请求报文后同样也返回一个ACK
给服务器表示确认,服务器端接收到客户端传回的ACK后就会变成 ESTABLASHED 状态
最终服务器端到客户端的传输通道建立完毕,至此客户端与服务器之间的双向通道建立完
成,这就是三次握手。
'''
# 为什么不能是二次握手?(简言之,二次握手会产生资源浪费)
'''
如果是两次握手的情景:
客户端在发送一个连接建立请求之后进入等待状态,等到服务端确认之后就进入established状态。
服务端在发送一个确认连接建立请求报文之后(不管客户端是否有回应)也进入established状态。
这就好比, A给B打电话, A:你听得到我说话吗? B:我听得到啊 A和B就都以为对方都能听得到自己了。
但有一种情况是,B的麦是坏的,A根本就听不到B说话,结果A没收到B的回应,但B却以为A能听得到他,
B就一直等着A说点什么...这样让B身心俱疲。
而三次握手:
客户端在发送一个连接建立请求报文之后进入等待状态,等到服务端返回确认建立连接的通知
服务端发送确认建立连接请求报文,同时向客户端发送连接建立请求报文,进入等待状态
客户端接受到服务端发送的确认请求报文以及来自服务端的连接建立请求报文。进入established状态
并发送确认连接建立请 求报文给服务端。服务端接受到来自客户端的确认建立连接报文,进入established
A:你能听得到我说话吗? B:我听得到啊,你能不能听得到我说话?
A:我也听得到你啊。( established) B:(established) A和B都能明确知道对方肯定能听得到自己说话
当然4次握手或者n次握手也可以但是没有必要,因为如果建立连接的时间过长的话那么效果也就会大打折扣
'''
-
SYN洪水攻击
''' SYN洪水攻击:tcp是好人协议,不管是什么客户端,只要向服务器发送了请求服务器就会接收并尝试向客户端建立连 接。SYN洪水攻击,就是利用建立大量的虚拟ip去向服务器发送请求,发完之后就消失,此时服务器就会被大量的 虚拟ip所占满了一直处于`SYN_RCVD`状态,导致真正的客户端再想访问服务器就没法访问 (类似于让一群乞丐去堵一家公司的大门,导致公司员工无法进入公司) '''
-
四次挥手
# 断开链接时,由于链接内有数据传输,所以必须分四次断开
网络通信——应用层
自定义协议
-
在应用层如果觉得别人的协议过于的复杂,我们可以自定义协议=》头部+数据部分
# 自定义协议需要注意的问题: ''' 1、两大组成部分=头部+数据部分 头部:放对数据的描述信息 比如:数据要发给谁,数据的类型,数据的长度 数据部分:想要发的数据 2、头部的长度必须固定 因为接收端要通过头部获取所接接收数据的详细信息 ''' # 应用层的协议:http https ftp
Socket
socket的作用
-
我们只需要负责应用层即可,传输层网络层数据链路层以及物理层之间的通信,socket帮我们全部都处理好了,所以我们只要负责好应用层就可以利用socket来进心网络通信了。
-
socket是位于应用层与传输层之间的一个抽象层它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
-
也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序而程序的pid是同一台机器上不同进程或者线程的标识**程在网络中通信。
小结
数据传输动图如下