Python进阶笔记(六)Socket编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29027865/article/details/87909838

6.1 TCP-ip协议

网络协议的目的是规范不同设备间的数据共享,而TCP-IP是一个协议族,其中包含的每一种协议都规范了某一种情况下的策略,而这些协议的总称,称为TCP-ip协议。协议是为了完成进程之间通信的一种规范
根据所用的功能不同,而将TCP-ip协议分成了几个层次:
在这里插入图片描述
如果分成四个层次,即链路层->网络层->传输层->应用层
如果是分成七个层次,则是将链路层拆分为物理层和数据链路层,应用层拆为会话层,表示层和应用层,总体为:物理层->数据链路层->网络层->传输层->会话层->表示层->应用层

6.2 端口

插上网线,同一个机房内就能互相聊天,原因就是网线插到了交换机上,交换机能够把所有的电脑组成了自己的网,这个网叫做局域网。局域网最简单的组建方式就是找一个交换机。
当飞球发送数据时,通过网线给了交换机,交换机又给了网卡,当网卡知道后,该怎么知道这个数据是给谁的呢?发送方是知道给谁发的,操作系统怎么确定呢?
操作系统为了来区分数据是给哪个进程的,于是为进程额外添加了一个数字,而这个数字就当作了端口。
pid用来在操作系统上管理某个进程,通过ip知道电脑发到哪。
但是数据发给了电脑后,这个电脑该如何知道将数据传给哪个应用呢?
端口就是在操作系统中用来标记进程的东西,其可以理解为进出进程的通道。

那为什么不用pid,而用一个新的值叫做端口呢?
如果在一台电脑上,qq想发一条消息给微信,在一台电脑上pid绝对不相同,而且能够知道对应的进程的pid,但是如果是跨电脑,在一个电脑上的qq想给另一个电脑的qq发消息,你无法知道另一台电脑的pid是多少。
所以在不知道对方飞秋pid是多少的前提下,只要能保证有一个唯一的确定的值,接下来写这个值就能保证区分不同的进程,这个值就叫做端口。
端口就是用来标记唯一的一个进程的方式,标记的数字就叫做端口号,范围为0-65535;
端口号一般分为知名端口和动态端口:
知名端口即众所周知的端口号,范围从0到1023;
我们在访问一个网站时,如:www.baidu.com,现在通过自己的浏览器与百度的服务器之间建立通信,但是自己怎么知道其用的端口呢?一般情况下,在浏览器上写入一个网址后,就相当于知道了我要去访问谁,在没有填端口的情况下就能访问的原因在于,80端口分配给了HTTP服务。

动态端口的范围是从1024-65535之间,

6.3 ip地址

在逻辑上,标记一台唯一的电脑,用ip地址。ip地址就是一串值。

ip地址包括两部分,网络地址和主机地址,其可以分为A-E五类,但一般是用A,B,C类。ip地址总共是4个字节,A类地址指的是第一个不变,后3个字节可以变;B类地址指的是前两个不变,后两个可以变;C类地址指的是前三个不变,后一个可以变;
前面的不变的用来区分一个网络号,后面变的来区分是这个网里面的哪一台电脑。
但是ip地址的主机号中,最小的值和最大的值不能用,即1-254可以用,主机号全为0和主机号全为1的,即0和255不能用,
不能用0的原因是因为其表示当前的网络号,而255表示广播地址;
ipv4地址:4G,1G为2的30次方;
ipv6地址:用16进制的冒号隔开;
通信的中间还是ipv4,只是在两端改为了ipv4;
D类地址用于多点广播,其第一个字节以"1110"开始,是一个专门保留的地址。
它并不指向特定的网络,目前这一类地址被用在多点广播中,多点广播地址用来一次寻址一组计算机。

6.4 socket的简介

同一台电脑上的不同进程间的通信,可以考虑队列,命名管道,内存映射等方式,但是在不同电脑上的进程之间该如何通信呢?

同本地的pid一样,本地通过pid来唯一标示一个进程,而在网络中可以通过ip地址+端口号的形式来唯一标识网络中的主机。

socket就是完成在多个电脑上完成通信的方式,socket就是一套机制,通过这套机制,就可以把数据通过网络发到不同的电脑上去。

创建一个tcp socket(tcp套接字)

import socket
# 第一个参数就是ip地址协议,第二个参数表示完成TCP的通信
s = socket.socket(socket.AF_INIT,socket.SOCK_STREAM)
print("Socket Created")

创建一个udp socket(udp套接字)

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
print("Socket Created")

那么现在我们就清楚,ip地址是用来确定哪一个电脑,端口号用来确定电脑的哪一个进程,如果我们再确定好了协议类型(TCP还是UDP),那么就可以实现通信;
TCP是面向连接的,其为两个端系统之间的数据流动提供了可靠的字节流通道, UDP是无连接的,从一个端系统走向另一个端系统发送独立的数据分组,而不对交付提供任何保证。


6.5 端口以及绑定端口

UDP的通信可以理解为写信,和打电话不同,打电话是先建立通道。而写信的每一封信上都会有收信人的地址。UDP不稳定;
UDP在局域网中丢包的可能性几乎为0,
使用udp发送的数据,在每一次都需要写上接收方的ip和port;
一个程序用了套接字,操作系统就会给一个端口,这个端口在每次发送都是会变得;

在同一个系统中,端口不允许相同,即如果某个端口已经被使用了,那么在这个进程释放这个端口之前,其他进程不能使用这个端口;
原因:端口用来区分一个进程,如果要是相同了,那么就不能把数据发送给正确的进程,因此不允许相同。

udp绑定信息
绑定信息就是为了防止网络程序在每次运行的时候端口随机变化;

绑定就是为了让应用程序使用一个固定的端口;

from socket import *
# 1.创建套接字
udpSocket = socket(AF_INET,SOCK_DGRAM)

# 2.绑定本地的相关信息,如果一个网络程序不稳定,则系统重新分配
bindAddr = ('', 7788)  # ip地址和端口号,ip一般不用写,表示本机任何一个ip
upSocket.bind(bindAddr)

# 3.等待接受对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接受的最大字节数

# 4.显示接受到的数据
print(recvData)

# 5.关闭套接字
udpSocket.close()

猜你喜欢

转载自blog.csdn.net/qq_29027865/article/details/87909838