c/s架构:
客户端和服务器端
c端—————网络—————s端
s端:
-
有固定的ip
-
稳定一直在运行,支出并发
网路:网络连接介质 + 网路协议(osi七层)
五层(七层)协议:应传网数物(应表会传网数物)
物理层(介质加信号):主要就是由二进制组成的 电信号传输介质,处于最底层
数据链路层(数据帧、mac、广播):主要就是把物理层的电信号进行分组,每一组叫一个数据报/数据帧,每一个数据帧分成,报头head和数据data两部分组成
-
每一个数据报,都是由报头和数据部分
- 头:固定18个字节,6:发送者地址/6:接收者地址/6:数据类型
-
MAC地址:发送者,接收者地址,就是mac地址
- 每块网卡都有一个唯一的mac地址:12位16进制数表示(前六位是厂商编号,后六位是流水线号)
-
广播:同一个局域网内通信,会出现广播风暴(简单来讲就是由于广播数据太多,占用大量的网络带宽,导致正常业务不能运行,甚至瘫痪的现象)
网络层(ip):
- ip: ipv4: 32位2进制表示,点分十进制表示,从0.0.0.0到255.255.255.255,范围是有限的,不能表示出所有的网络设备,于是出现了ipv6
- 子网掩码: 通过子网掩码和ip判断两个ip是否处于同一个网段,通过ip地址和子网掩码做按位与(都为1则按位与是1,其余全是0)运算
- 172.16.10.10/24 包含了ip地址和子网掩码(24表示的就是24个1,即3组8个1,也就是十进制255.255.255.0)
- ip跟mac有转换关系
- 主机172.16.10.10/24访问172.16.10.11/24
- ARP协议:广播的方式发送数据包,获取目标主机的mac地址
- mac地址学习:mac地址和ip地址的映射表
- 第一次接收到就会在ip/mac映射表中添加一条数据{‘172.16.10.11’: ddsfjasif
- 任何一种协议都有头和内容
传输层(tcp/udp):
-
tcp协议;
- 三次握手,四次挥手,链接如何建立,发数据如何保证可靠,断开如何断开,在建立链接过程中有状态
""" 序列号seq: 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号 确认ACK:占1位,仅当ACK=1时,确认号字段才有效,ACK=0时,确认号无效 PS:ACK,SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack,seq小写的单词表示序号 """
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1), 同时自己也发送一个SYN包(syn=k), 即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISGED(TCP链接成功)状态,完成三次握手
1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加一),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1, ack=u+1, 并且带上自己的序列号seq=v, 此时,服务器就进入了CLOSE-Wait(关闭等待)状态,TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受
3.客户端收到服务器的确认请求后,此时客户端就进入了FIN-WAIT-2(终止等待)状态,等待服务发送连接释放报文(在此之前还需要接受服务器发送的最后的数据)。
4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1, 而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,猜进入CLOSE状态
6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态,同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
服务端如果看到大量的syn_rcvd状态,表明收到了dos和ddos攻击:拒绝服务攻击和分布式的拒绝服务攻击
端口号:端口范围0-65535,0-1023为系统占用端口
- udp协议:
发送,不需要对方响应,所以数据不可靠(看视频就是基于这种协议进行的,卡顿,马赛克就是数据丢失)
- 端口:
通过ip+子网掩码唯一确定一台设备
通过ip+子网掩码+端口号唯一确定一个软件 - 半连接池
就是没有完全建立连接时,存进去请求数据,是用先进先出的队列存储的
应用层 HTTP、DNS(待补充)
上网流程分析:
在浏览器输入www.baidu.com,会取dns服务器通过域名解析成ip地址,向ip+端口号这个地址发送请求,就会访问到百度的服务器
socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,用来实现进程在网络中通信
简单的C/S通信
#Server.py
#导入一个socket模块
import socket:
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind('192.168.11.191', 8080)#写本机ip,局域网外部可以访问
#soc.bind('127.0.0.1', 8080) #如果写这个ip,只能自己访问
soc.listen(5)
conn,addr = soc.accept()
data = conn.recv(1024)
conn.send(b'xxxx')
conn.close()
soc.close()
#CLient.py
import socket
soc=socket.socket()
soc.connect(('192.168.11.146', 8080))
soc.send(b'xxxx')
data=soc.recv(1024)
soc.close()
图片来源 https://blog.csdn.net/qq_38950316/article/details/81087809,侵删