一、IP和ARP协议(了解)
以太网协议:
(1)一组电信号称为一组数据报或一组数据帧
(2)但凡接入互联网的煮鸡,必须有一块独一无二的网卡
(3)所有的数据报都必须分为报头和数据两部分。报头固定18个字符
IP协议:
- 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
- 范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:172.16.10.1
ip地址分成两部分
- 网络部分:标识子网
- 主机部分:标识主机
注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网
例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网
2、ARP协议
作用:以广播的方式发送数据包,获取目标主机的mac地址
二、套接字socket
1、socket是什么?
翻译过来称为套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议
在程序员的言论,他就是一个封装好的模块!要完成网络通讯,只需要使用系统提供的socket模块就行
2、TCP和UDP是传输层最常见的协议,主要控制传输数据的方式。(传输层)
TCP:
传输方式:通过三次握手来与服务器建立连接,
优点:可以保证数据的完整性
比如:a机器给b机器发送数据包 要求b机器必须立即返回一个确认包,a机器会等待一段时间,如果超时还没有收到确认,则重发数据
缺点:传输效率低
使用场景: 文字聊天,支付宝转账等,
UDP:
传输方式:不需要建立连接,直接发送
缺点: 不能保证数据的完整性
优点:传输效率比TCP高
使用场景:视频通话,语音通话,UDP
python中的socket
在使用socket的时候用户需要关心的是 ip地址,port端口, 传输协议TCP/UDP,你要发送的数据data
在写网络编程的时候,必然是有两台代码,对应着客户端和服务器
使用socket来完成TCP通讯
应该先完成服务器的代码编写
3、TCP的服务端:
import socket #1.买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP流式协议, print(phone) #是用来接收链接请求,从而建立链接的 #2.插手机卡 phone.bind(('127.0.0.1',8080)) #0-65535 #3.开机 phone.listen(5) # 同一时刻最大请求数为5个 print('start....') #4.等待电话请求 conn,client_addr=phone.accept() #(双向链接的套接字对象,存放客户端ip和端口的小元组) # print(conn) # conn代表双向链接,用来收发消息 # print(client_addr) #5.收发消息 data=conn.recv(1024) #1024接收的最大字节数bytes print('收到客户的数据',data) conn.send(data.upper()) #6.挂电话链接 conn.close() #7.关机 phone.close()
4、TCP的客户端
import socket #1.买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP流式协议, #2.拨号 phone.connect(('127.0.0.1',8080)) #3.发收消息 phone.send('hello'.encode('utf-8')) # 只能发bytes类型 data=phone.recv(1024) print('收到服务端的消息: ',data) #4.挂电话链接 phone.close()
5、UDP的服务器
import socket # 1.创建socket对象 s = socket.socket(type=socket.SOCK_DGRAM) # 2.绑定端口和ip s.bind(("127.0.0.1",10000)) while True: # 3.接受数据 res = s.recv(1024) print(res) while True: msg = input(">>>:") # 需要获取对方的ip和端口 #s.sendto(msg.encode("utf-8"), ("127.0.0.1", 10000)) # 关闭资源 s.close()
6、UDP的客户端
import socket # 1.创建socket对象 c = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),("127.0.0.1",10000)) c.close()
7、TCP的通信循环和链接循环的客户端
from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1', 7500)) server.listen(5) while True: while True: conn, client = server.accept() data = conn.recv(1024) conn.send(data) conn.close() server.close()