一、ip地址
- 作用
用来标记网络中的一台电脑
- 分类
1.A类地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的二进制最高位必须是“0”
地址范围1.0.0.1-126.255.255.254
二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
B类地址:一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的二进制最高位必须是“10”,
地址范围128.1.0.1-191.255.255.254
二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
可用的B类网络有16384个,每个网络能容纳65534主机
C类地址:一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”
范围192.0.1.1-223.255.255.254
二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
C类网络可达2097152个,每个网络能容纳254个主机
D类地址:D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中.
多点广播地址用来一次寻址一组计算机 s 地址范围224.0.0.1-239.255.255.254
E类地址:以“1111”开始,为将来使用保留
E类地址保留,仅作实验和开发用
私人ip地址;国际规定有一部分IP地址是用于我们的局域网使用,也就是属于私网IP,不在公网中使用的,它们的范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
二、端口
- 作用
用来区分电脑中具体哪个程序
- 端口号
端口是通过端口号来标记的,端口号只有整数,范围是从0到65535 - 分类
1.知名端口
知名端口是众所周知的端口号,范围从0到1023
80端口分配给HTTP服务
21端口分配给FTP服务
2.知名端口
动态端口的范围是从1024到65535
之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。
动态分配是指当一个系统程序或应用程序程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。
当这个程序关闭时,同时也就释放了所占用的端口号
3.UDP通信
- 客户端
#创建套接字
import socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#发送消息
udp_socke.sendto(‘发送数据’.encode(‘utf-8’),(‘目标主机ip’,目标主机port))
#接收消息
recv_date = udp_socket.recvfrom(1024)
#关闭套接字
udp_socket.close()
注
①socket套接字相当于双方进行通信的通道
②发送的数据需要进行utf-8编码
③recvform中的参数1024表示一次性最大接收1024个字节的数据,接收到的数据recv_date的数据类型是元组型,recv_date[0]是接收到消息,字符串类型,recv_date[1]是发送方的ip以及端口消息,也是字符串类型
- 服务端
#创建套接字
import socket
udp_sever = socket.sever(socket.AF_INET,socket.SOCK_DGRAM)
#绑定本地信息
socket.sever.bind((‘本机ip’,本机端口))
#发送消息
udp_sever.sendto(‘发送数据’.encode(‘utf-8’),(‘目标主机ip’,目标主机port))
#接收消息
recv_date = udp_sever.recvfrom(1024)
#关闭套接字
udp_sever.close()
注
①一般做为服务器需要绑定端口,也可以不绑定端口,
②udp通信客户端与服务端没有太大的区分
③bind的参数‘本地ip’可以为空字符串‘’,相当于传递本机的任意一个ip地址
四、TCP
- 客户端
#创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务端
tcp_socket.connect((‘服务端ip’,服务端port))
#发送数据
tcp_socket.send(‘要发送的消息内容’.encode(‘utf-8’))
#接收数据
tcp_socket.recv(1024)
#关闭套接字
tcp_socket.close()
注
tcp客户端需要进行connect连接操作,等同于tcp建立三次连接过程
服务端
#创建套接字
tcp_sever=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定本机ip和port
tcp_sever.bind((‘本机ip’,本机端口))
#将模式设置为被动连接模式(可容许客户端连接的模式)
tcp_sever.listen(128)
#等待客户端连接
client_sock,client_addr = tcp_sever.accept()
#接收消息
Recv_data = client_sock.recv(1024)
发送消息
lient_sock.send(‘需要发送的消息’.encode(‘utf-8’))
#关闭通信套接字
client_sock.close()
#关闭监听套接字
tcp_sever.close()
注
①服务端在进行accept时会造成堵塞,直到接收到消息,才会解堵塞
②服务端accept()函数有两个返回值,第一个返回值是用于可客户端通信的套接字,第二个参数是此客户端的ip以及port信息
③创建的tcp_sever套接字用于监听所有与服务器连接的客户端,如果有客户端连接,就返回一个新的套接字
④服务器一般先接收客户端的消息,再向客户端发送消息,即先recv后send
⑤通常来说,客户端先关闭连接,即client_sock.close(),然后服务器再关闭连接tcp_sever.close()