python第十四天-网络2

xiaoxiao2021-03-01  31

UDP广播

广播只能在UDP中使用,TCP中不能用,UDP相当于写信,TCP相当于打电话

TCP介绍

TCP传输控制协议 ,稳定,相较UDP慢一些,几乎体现不出来。

UDP用户数据包协议

TCP服务器端

服务器

from socket import * serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(("",8899)) serverSocket.listen(5)#指明服务器在处理连接的时候允许多少个连接在等待,一般设置为5,很多os不支持>5的 clientSocket,clientInfo = serverSocket.accept() #clientSocket 表示这个新的客户端 #clientInfo 表示这个新地客户端的IP和POrt recvData = clientSocket.recv(1024) print("%s:%s"%(str(clientInfo),recvData)) clientSocket.close() serverSocket.close()

客户端

from socket import * clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect(("192.168.252.133",8899)) clientSocket.send("haha".encode("gb2312")) recvData = clientSocket.recv(1024) print("recvData:%s"%recvData) clientSocket.close()

注意:

1.tcp客户端已经连接好了服务器,所以在以后的数据发送中,不需要填写对方的IP和port

2.udp在发送数据的时候,没有之前的链接,所以需要在每次的发送中都要填写接收方的IP和port

3.什么是堵塞?一个停止并等待输入或输出的程序称之为被堵塞的程序。

4.服务器端很多用UDP,因为从客户端发出的信息包如果没到的话,服务器根本不知道客户端曾试图发过请求,没法察觉和解决丢失信息包的问题...

多线程tcp服务器

def clientDeal(cSocket): while True: cSocket.recv(xxx) cSocket.send(x) s = socket() s.bind() s.listen() while True: cSocket,cInfo = s.accept() p = Process(target=clientDeal, args=(cSocket,)) p.start()

Packet Tracer

辅助学习工具,设计、配置、排除网络故障提供了网络模拟环境。⽤户可以在软件的图形⽤户界⾯上直接使⽤拖曳⽅法建⽴⽹络拓扑, 并可提 供数据包在⽹络中⾏进的详细处理过程, 观察⽹络实时运⾏情况。

网络掩码

作用:和IP地址进行按位与得到网络号

1. 通过集线器链接多台电脑

每个数据包的发送都是以⼴播的形式进⾏的, 容易堵塞⽹络 2. 通过交换机链接多台电脑

问题:

1.两台电脑之间能通信的前体是什么?

在同一网段内,同一网络号内

2.多态电脑之间为什么不能把网线剪开链接在一起?

数据是通过电信号控制,如果多个电信号一起发送一起接收就乱了

3. 链接多台电脑的hub(集线器)有什么作用?

实现多态电脑链接在一起,组成局域网

4.集线器和交换机的区别?

集线器所收到的所有数据包都是以广播的形式发送,交换机有个学习的过程,如果通信过,就不需要再广播,效率提高

 

网卡 

实际地址,硬件地址,MAC地址,是网卡的序列号,前三组是厂商序号,后三组确定厂商生产的网卡序号

OSI模型对应的就是七层模型。

icmp 

控制报文协议,用于IP和路由器之间传递控制消息。

ping检测网络是否畅通,发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。

arp

地址解析协议,根据IP地址获取MAC地址的协议,主机发送包含目的IP地址的ARP请求广播到网络上的所有主机并接收返回信息确定目标的MAC地址。

rarp 根据MAC地址找IP地址

通过路由器组网

路由器

十字路口的路标,路由器(router)又称网关设备(gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络,是代表一个单独的网络或者一个子网

路由器 作用:链接不同的网络使之能够通信

mac地址,在两个设备之间通信时在变化,

而IP地址,在整个通信过程中都不会发生任何变化

IP 标记逻辑上的地址

mac 标记实际转发数据时的设备地址

netmask: 和IP地址一起来确定网络号

默认网关:发送的IP不在同一个网段内,那么会把这个数据转发给默认网关

连接:设置路由器两端的IP地址,port状态设置为on

路由器的两端IP设置 xxx.xxx.x.254

域名系统DNS

是一个分布式的数据库,主要是用来把主机名转换为IP地址。

访问百度的过程

1.先要解析出baidu.com对应的ip地址 1.先知道默认网关的mac 1.使用arp获取默认网关的mac地址 2.组织数据发送给默认网关(IP还是dns服务器的IP,但是mac地址是默认网关的mac地址) 3.默认网关拥有转发数据的能力,把数据转发给路由器 4.路由器根据自己的路由协议,选择一个合适的较快的路径转发数据给目的网关 5.目的网关(dns服务器所在的网关),把数据转发给dns服务器 6.dns服务器查询解析出baidu.com 所对应的IP地址,并发它原路返回给 请求这个域名的client 2.得到了baidu.com对应的IP地址后,会发送TCP的三次握手,进行连接 3.使用http协议发送请求数据给web服务器 4.web服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器 5.浏览器接收到数据后,通过浏览器自己的渲染功能来显示这个网页 6.浏览器关闭tcp链接,即4次挥手 完成整个访问过程

  TCP三次握手四次挥手

每一次TCP连接都需要三个阶段:连接建立、数据传送和连接释放。三次握手就发生在连接建立阶段。三次握手为了建立可靠连接。是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手,断开连接:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1) TCP客户端调用close(),发送一个FIN,用来关闭客户到服务器的数据传送。

(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

(3) 服务器关闭客户端的连接,发送一个FIN给客户端。

(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

tcp中,如果有一方收到了对方的数据,一定会发送ack确认包给发送方

而在udp中,没有这个过程,因此导致tcp稳定,而udp不稳定

tcp长连接和短连接

TCP在真正的读写操作之前,server和client之间必须建立一个连接,读写操作完成,双方不需要这个连接时他们就可以释放这个连接连接的建立通过三次挥手、释放则需要四次握手。

1. TCP短连接

模拟一种TCP短连接的情况:

client 向 server 发起连接请求server 接到请求,双方建立连接client 向 server 发送消息server 回应 client一次读写完成,此时双方任何一个都可以发起 close 操作

在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

2. TCP长连接

再模拟一种长连接的情况:

client 向 server 发起连接server 接到请求,双方建立连接client 向 server 发送消息server 回应 client一次读写完成,连接不关闭后续读写操作...长时间操作之后client发起关闭请求

TCP长/短连接的优点和缺点

长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

TCP十种状态

listen参数问题

服务器端

#coding=utf-8 from socket import * from time import sleep #创建socket tcpSerSocket = socket(SF_INET, SOCK_STREAM) #绑定本地信息 address = ("",7788) tcpSerSocket.bind(address) connNum = int(input("请输入要最大的连接数:")) #使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动 tcpSerSocket.listen(connNum) while True: #如果有新的客户端来连接服务器,那么就会产生一个新的套接字专门为这个客户端服务器 newSocket,clientAddr = tcpSerSocket.accept() print(clientAddr) sleep(1)

客户端

#coding=utf-8 from socket import * connNum = input("请输入要连接服务器的次数:") for i in range(int(connNum)): s = socket(AF_INET, SOCK_STREAM) s.connect(("127.0.0.1",7788))#127.0.0.1指的是本机 print(i)

转载请注明原文地址: https://www.6miu.com/read-3450121.html

最新回复(0)