冷酷校草的调皮小妹,尼罗河上的惨案2004,薄熙来 现状
路由器:电脑上所有与公网之间的消息的传递的进出口都在路由器上,路由器有公网ip,这个ip是全球网络连接的唯一标识,路由器具有消息转发的功能
交换机:主要是把连接到交换机上的电脑连接到一起,其次是交换机还可以设定一个ip范围,从而使得广播的范围缩小
ip:ip分为两个,一个是电脑上由交换机分配的ip,这个ip在一个子网内是不可以重复的;另一个是公网ip,是路由器上的,这个是全球网络连接间的唯一标识
mac地址:电脑上的网卡在出厂时被烧制上的全球唯一标识码
dhcp协议:这是交换机上动态分配电脑ip的协议
arp协议:这是交换机上的ip和mac对应表,我们可以通过ip来查找出对应的mac地址
dns服务器:这是域名解析器,我们可以通过输入域名来查找对应的公网ip
网关:这相当于路由器上看门的,也就是 路由器上的公网ip,在公网上传输的数据,只有在目标ip和网关一致时,网关才会让数据进来
子网掩码:主要用于判断两个ip是否属于一个子网
上图为网络通信流程图,主要分为以下三种情况:(以下三种情况描述纯属个人行为,不正确之处请指正)
一、从1号电脑传输数据到2号电脑
首先1号电脑把数据发到交换机a,数据主要包括2号电脑ip,自身电脑ip和mac地址,加上真正要传的内容,数据到交换机a后,经过arp协议,加上2号电脑的ip获得对应的mac地址,交换机a就会在自身所连接的子网内广播,在这子网内的电脑都会收到信息,在2号电脑收到消息后,确认是自己ip和mac地址,然后就确认接收数据,其他的电脑确认不是自身的ip和mac,就直接扔掉,这样就完成了 数据传输。
二、从1号电脑传输数据到3号电脑
首先1号电脑把数据发到交换机a,数据主要包括3号电脑ip,自身电脑ip和mac地址,加上真正要传的内容,数据到交换机a后,交换机a就会在自身所连接的子网内广播,但没找到,于是把数据抛给路由器,然后由路由器广播到接入此路由器的交换机,找到对应的交换机2,通过交换机2广播,找到3号电脑,完成通信。
三,从1号电脑到4号服务器
首先在1号电脑上浏览器上输入4号服务器上一个网的域名,通过dns服务器查找域名对应的公网ip,然后把请求一层层发到路由器,路由器经过计算最有路径,找到目标公网ip对应的路由,然后根据公网ip和程序端口号找到要访问的网页,然后服务器在刚才的路径返回回去,把网页内容返回给1号电脑,此时我们就完成了通信,就可以上网了。
c/s架构:即client客户端/server服务端架构,比如qq,微信,客户端需要下载应用程序,安装之后才可以使用
b/s架构:即browser浏览器端和server服务器端,比如各种网页啊,这个是不需要下载安装应用程序
tcp协议:可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用tcp的应用:web浏览器;文件传输程序
udp协议:不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用udp的应用:域名系统 (dns);视频流;ip语音(voip)
在tcp协议下,是基于连接的,为了保证数据安全,存在一个三次握手,四次挥手的过程,而udp协议无连接的,所以没有这过程。
三次握手:
四次挥手:
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于established状态,然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭,一个流程。
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 unix,即人们所说的 bsd unix。 因此,有时人们也把套接字称为“伯克利套接字”或“bsd 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 ipc。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
在tcp下,基于连接的,需要先启动服务端,在启动客户端。服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
服务端程序
import socket #引入模块 server=socket.socket() #创建server对象 ip_port=('192.168.15.78',8888) #声明服务端的ip和程序端口 server.bind(ip_port) #把ip_port绑定到对象 server.listen() #监听 while 1: conn,addr=server.accept() #等待客户端连接 while 1: server_msg=input('服务端:') conn.send(server_msg.encode('utf-8')) #向客户端发送消息 from_client_msg=conn.recv(1024) #接收客户端消息 print(from_client_msg.decode('utf-8')) if from_client_msg.decode('utf-8')=='byebye': #如果收到消息为byebye,就断开此次连接,继续等待下一个客户端连接 break #这就是优雅的断开 conn.close() server.close()
客户端程序
import socket client=socket.socket() server_ip_port=('192.168.15.78',8888) #设置要连接服务端程序的ip和端口 client.connect(server_ip_port) #进行连接 while 1: from_server_msg=client.recv(1024) #接收服务端消息 print(from_server_msg.decode('utf-8')) client_msg=input('客服端:') client.send(client_msg.encode('utf-8')) #向服务端发送消息 if client_msg=='byebye': #如果输入为byebye,就断开连接 break client.close()
基于udp协议下的socket是不需要连接的。服务器端先初始化socket,然后与端口绑定(bind),recvform接收消息,这个消息有两项,消息内容和对方客户端的地址,然后回复消息时也要带着你收到的这个客户端的地址,发送回去,最后关闭连接,一次交互结束
服务端
import socket server=socket.socket(socket.af_inet,socket.sock_dgram) server_ip_port=('192.168.12.39',8888) server.bind(server_ip_port) while 1: from_client_msg, adrr = server.recvfrom(1024) print('来自%s的消息:%s'%(adrr,from_client_msg.decode('utf-8'))) if from_client_msg.decode('utf-8')=='bye': break msg=input('请输入:') msg1=msg+','+from_client_msg.decode('utf-8').replace('sb','alexsb') server.sendto(msg1.encode('utf-8'),adrr)
客户端
import socket client=socket.socket(socket.af_inet,socket.sock_dgram) server_ip_port=('192.168.12.39',8888) while 1: msg=input('请输入:') client.sendto(msg.encode('utf-8'),server_ip_port) if msg=='bye': break from_server_msg,adrr=client.recvfrom(1024) print(from_server_msg.decode('utf-8')) client.close()
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
新手学习Python2和Python3中print不同的用法
Python基于os.environ从windows获取环境变量
网友评论