网络编程的一些基本知识
- 网络:
- 网络协议:
- 网络模型:
- IP地址
- 端口:
- 本地使用:
- 网络使用:
- 主机:
- 域名:
- 获取IP地址、计算机名:
- 传输层协议:
- TCP/IP协议:
- TCP协议:
- UDP协议:
套接字编程
socket模块
- socket() 函数:
- 作用:创建套接字对象。
- 格式:socket([family[,type[,poroto]]])
- 参数:
* family:
AF_INET:
这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址
AF_INET6:
与上面类似,不过是来用IPv6的地址
AF_UNIX:
本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用
* type:
SOCK_STREAM:
这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。
这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM:
这个协议是无连接的、固定长度的传输调用。该协议是不可靠的
使用UDP来进行它的连接。
SOCK_SEQPACKET
该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。
必须把这个包完整的接受才能进行读取。
SOCK_RAW:
socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM:
这个类型是很少使用的,在大部分的操作系统上没有实现,
它是提供给数据链路层使用,不保证数据包的顺序
* proto:
选择子协议类型 通常为0。 传0 表示使用默认协议。
- 返回值:
* 成功:返回指向新创建的socket的文件描述符
* 失败:返回-1,设置errno
- bind()函数:
- 作用:
将一个套接字文件描述符与一个本地地址绑定在一起,
即把发送数据的端口地址和IP地址进行了指定。(针对服务端)
- 格式:
int bind(sockfd, addr[, addrlen])
* sockfd: 套接字描述符
* addr: 地址信息,要绑定的地址信息 构造出IP地址加端口号
* addrlen: 地址信息长度
- 返回值
* 成功 0
* 失败 -1
- 常见使用:bind(addr) 绑定地址,参数addr是元组,(ip,port)
- listen()函数:
- 作用:
将套接字设置为监听套接字,等待客户端连接(针对服务端)
- 格式:
listen(int sockfd, int backlog);
* sockfd:socket文件描述符
* backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接数和
- 返回值:
* 成功返回0
* 失败返回-1
- 常用:lisent(backlog):开始监听,等待客户端连接
- connect()函数:
- 作用:指定套接字上建立连接。(针对客户端)
- 格式:connect(address)
* 参数address是元组,服务端地址
* 元组为:(ip, port),和服务端被绑定的地址和端口一致
- accept()函数:
- 作用:响应客户端请求,接受连接。
- 格式:connfd,addr = accept()
- 返回值:
* 成功返回一个新的socket文件描述符,用于和客户端通信
- connfd:客户端连接套接字
- addr:连接客户端的地址
* 失败返回-1,设置errno
- send()函数:
- 作用: 用来在TCP套接字上发送数据。
只能对处于连接状态的套接字使用.(accept后)
- 格式:send(bytes[, flags])
* 发生内容必须是bytes格式
- 注意:执行成功只是说明数据写入套接字的缓冲区,
并不代表数据已经通过网络发送到目的地。
- sendto()函数:
- 作用:用来在UDP套接字上发送数据。
- 格式:sendto(string, address)
* 把string中的指定内容发送给address指定的地址
* string就是之要发送的数据
* address是一个包含接收方主机IP地址和应用进程端口号的元组
* 格式为(IP地址,端口号)
- 返回值:发送的字节数
- recv()函数:
- 作用:用来在TCP套接字上接收数据
从面向连接的套接字上接收数据并保存到指定的缓存区
- 格式:recv(bufsize[,flags])
* bufsize:接收到的最多的字节大小
* flags
- 返回值:接受的数据,格式是bytes
- recvfrom()函数:
- 作用:用来在UDP套接字上接受数据
- 格式:recvfrom(bufsize[,flags])
- 返回值:返回一个元组(data,addr)
- data:接受的数据,格式是bytes
- addr:消息发送端地址
- setsockopt()函数:
- 作用: 获取或者设置与某个套接字关联的选项
- 格式:setsockopt(level,option[,value])
* level:选项类别,可以取三种值:
1)SOL_SOCKET: 通用套接字选项.
2)IPPROTO_IP: IP选项.
3)IPPROTO_TCP: TCP选项.
* option:具体选项:
选项名称: 选项内容: 数据类型:
==========================SOL_SOCKET============================
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
===========================IPPROTO_IP============================
IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型
IP_TTL 生存时间 int
============================IPPRO_TCP============================
TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY 不使用Nagle算法 int
* value:选项值:一般默认为1
- getsockname()函数
- 作用:函数获取套接字的绑定地址
- 返回值:返回绑定地址
- fileno()函数:
- 作用:获取套接字的文件描述符
- 返回值:返回文件描述符
UDP
- 服务端流程:
- 1.创建数据报套接字
socket(AF_INET,SOCK_DGRAM)
- 2.绑定地址
bind(addr)
- 3.消息的收发
recvfrom(buffersize)
返回值为:接受的数据和消息发送端的地址
sendto(data,,addr)
- 4.关闭套接字
close()
- 客户端流程:
- 1.创建数据报套接字
socket(AF_INET,SOCK_DGRAM)
- 2.消息的收发
recvfrom()\sendto()
- 3.关闭套接字
close()
- 案例UDP文件夹
TCP
- Server端流程
- socket()-->bind()-->listen()-->accept()
-->recv/send()--->close()
- Client端流程
- socket()-->connect()-->send/recv-->close()
- 案例TCP文件夹
本地套接字
- 本地套接字
linux文件:
bcd-lsp
b:块设备文件
c:字符设备文件
d:目录
-:普通文件
l:链接
s:套接字
p:管道
- 作用:用于本地不同的程序间进行通信
- 创建流程
- 1.创建本地套接字
sockfd = sockeet(AF_UNIX,SOCK_STREAM)
- 2.绑定本地套接字文件
选定文件位置和名称
sockefd.bind(path)
- 3.监听 listen()
- 4.消息收发, recv send
cookie
os.path.exists(path)
功能:判断一个文件是否存在
参数:目标文件
返回值:存在返回True,不存在返回False
so.remove() os.
- 案例 本地套接字 文件夹
TCP与http服务相关
- http协议
- 用途:
- 超文本传输协议,应用层协议
- 网页数据的传输,数据传输的方式
- 特点:
- 无状态的协议,即不吉利用户传输的信息
- 适合多种语言
- 应用层协议,传输层使用tcp协议
- 支持持久连接,http1.1
- http请求
- 格式:
- 请求行:具体的请求类别和请求内容
格式: GET / HTTP/1.1
请求类别: 请求内容 协议版本
GET 获取网络资源
POST 提交一定的附加信息,
得到返回结果
HEADER 获取响应头
PUT 更新服务器资源
DELETE 删除服务器资源
CONNECT
TRACE 用于测试
OPTIONS 获取服务器性能信息
- 请求头:对请求内容的具体描述信息
- 空行
- 请求体:请求参数或者提交内容
- http响应
- 格式:
- 响应行:反馈响应的情况
格式: 协议版本 响应码 附加信息
HTTP/1.1 200 OK
1xx:提示信息表示请求成功
2xx:响应成功
3xx:响应需要重定向
4xx:客户端错误
5xx:服务端错误
常见响应码:
200 成功
404 请求内容不存在
401 没有访问权限
500 服务器发生未知错误
503 暂时无法执行
- 响应头:
- 空行
- 响应体:返回给请求端的具体内容
- 简单案例请看ubuntu的 http_test.py
- HTTPServer 请看案例http_sever
- 案例 查看 httpserver 文件夹
阻塞与非阻塞
- 阻塞IO:
- 阻塞IO是IO的默认形态,是效率较低的一种IO情况。
- 情况:
- 某种条件没有达成
accept input recv
- 处理IO数据传输较长形成的阻塞
网络传输过程、文件读写过程
- 非阻塞IO
- 通过修改IO事件的属性,使其变为非阻塞
- s.setblocking(False)
- 案例:block_server.py
IO多路复用
- 处理流程:
- 将IO设置为关注IO
- 将关注IO提交给内核检测
- 处理内核交给我们反馈的准备就绪的IO
-方案:
- select --->window、 linux、 unix
- poll --->linux 、 unix
- epoll ---> linux、 unix
- select模块:
- 使用dir(select)查看
- select
- 监控IO事件,阻塞等待IO事件发生
- 案例 IO多用/select_server.py
- poll
- 1.创建poll对象
p = select.poll()
- 2.添加注册事件
p.register(s)
- POLLIN POLLOUT POLLERR POLLHUP POLLNVAL
rlist wlist xlist 断开 无效数据
- p.unregister(s)从关注事件中移除
- 3.阻塞等待IO发生
event = p.poll()
功能:阻塞等待IO发生
返回值:events是一个列表,
列表中给每一个元素都是一个元组,代表一个发生的IO事件
列表内容:[(fileno, event ),(),(),(),.....]
就绪IO的文件描述符 具体就绪事件
(唯一)
* 需要通过文件描述符(fileno)找到对应IO对象
采用字典 {s.fileno() : s}
- 案例 IO多用/poll_server.py
- epool方法
- 基本与poll方法相同
- 将生产对象poll()改为epoll对象事件
- 案例 IO多用/epoll_server.py
mail编程
- 电子邮件的历史
- 起源
- 1969 Leonard K ,教授发给同事的"LO"
- 1971 美国国防部
- 通讯地址里用@
- 1978年中国的第一份电阻邮件
- 管理程序
- Euroda使邮件普及
- Netscape, outlook, forcmail后来居上
- Hotmail使用浏览器发送邮件
- 参考资料
- [官网](https://docs.python.org/3/library/email.mime.html)
- 邮件工作流程
- MUA邮件用户代理
- MTA邮件传输代理
- MDA邮件投递代理
- 编写程序
- 发送 SMTP协议
- 接受 PoP3 and IMAP 协议
- 准备工作
- 注册邮箱
- 第三方邮箱需要特殊设置
- 进入中心设置
- 取得授权码
- PYTHON for mail :
- SMTP协议负责发送邮件
- 使用email模块构建邮件
- 纯文本邮件
- 案例 mail/07.py
- HTML格式邮件发送
- 准备HTML代码作为内容
- 吧邮件的subtype设为html
- 发送
- 案例 mail/08.py
- 发送带附件的邮件
- 可以吧邮件看成是一个文本邮件和一个附件的合体
- 一封陕如果涉及多个部分,需要使用MIMEM ultipar格式构建
- 添加一个MIMEText正文
- 天机一个MIMEBase或者MEMIText作为附件
- 案例 mail/09.py
- 添加邮件投,抄送等信息
- mail["From"]表示发送的信息,包括姓名和邮件
- mail["to"]表示接受者信息,包括姓名和邮件
- mail["Subject"]表示摘要或者主题信息
- 案例百度
- 同时支持html和text 格式
- 构建一个MIMEMultipar格时邮件
- MIMEMultipar的subtype设置成alternative格式
- 添加HTML和text邮件
- 案例百度
- 使用smtplib模块发送邮件
- POP3协议接受邮件