Python net 通信 编程
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
特点 传输层使用tcp协议1.支持客户端、服务器模式
2.灵活简单快速
http协议几乎可以传输任意格式的数据
3.http1.0 无连接 http1.1 支持持久连接
4.无状态
不记录用户的访问信息
是网络传输的一个标准化模型,是计算机网络体系结构发展的产物
1应用层 : 提供OSI的用户服务,例如处理程序,文件传输协议和数据管理。
2表示层 :完成数据的转换和文本压缩加密
3会话层:提供进程间的连接建立,选择使用什么样的传输层协议
4传输层 :建立网络连接,提供适合的传输服务,提供透明的传输服务,提供端到端的流量控制
5网络层 :控制分组传送,路由选择,网络互连。
6链路层 : 提供链路的交换,具体的数据发送功能
7物理层 : 物理硬件,提供具体的传输条件和传输接口规定
实际应用
网络四层模型 -- > 基于osi七层模型进行实际情况的整合
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层 : 链路层 物理层
协议:网络协议,是通信双方必须共同遵循的一个约定。如怎么建立连接,怎么进行识别
tcp协议 : 传输控制协议 传输层
udp协议 : 用户数据报协议 传输层
ip 协议 : 网间协议 网络层
http协议: 超文本传输协议 应用层
TCP/IP简介
IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1
实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。
IPv6地址实际上是一个128位整数,它是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334
。
import socket
# 获取当前主机主机名
In [2]: socket.gethostname()
# 解析服务器主机名,转变为数字地址
In [3]: socket.gethostbyname('localhost')
IP 地址
IPV4
192.168.1. 235
网段号 主机号 (2-254)
每部分 0-255
127.0.0.1 本机回环ip 做本机的网络实验测试使用IP
0.0.0.0 局域网可用ip获取 用作自动获取可用IP
获取主机网络信息
socket.gethostbyaddr('localhost')
('localhost', [], ['127.0.0.1'])
主机名 别名 主机IP
IP地址转换成二进制字节串
socket.inet_aton('192.168.1.1')
反向转换
socket.inet_ntoa(b'\xc0\xa8\x01\x02')
* 两个更新的函数,第一个参数可以传AF_INET AF_INET6
IP地址转换成二进制字节串
socket.inet_pton(socket.AF_INET,'192.168.1.1')
反向转换
socket.inet_ntop(socket.AF_INET,b'\xc0\xa8\x01\x02')
端口号
为了区分一台主机收到的数据包转交给那个进程处理
本质是一个整数 1--65535
1-1023 由众所周知的系统程序占用
1024 -- 10000 很多安装程序会使用 8888 9999 6666
>10000 我们自己写程序最好使用10000以上
查看某个服务程序的端口
socket.getservbyname('mysql')
dns(域名解析器)
子网掩码:配合IP使用,过滤当前网段
字节序
主机字节序有两种
大端序 高序字节存在低地址位
小端序 低序字节存在低地址位
网络字节序 ----》 大端序
序列转换方式
将16位网络字节序转换为本地
socket.ntohs(8)
将16位本地字节序转换为网络字节序
socket.htons(1024)
将32位本地字节序转换为网络字节序
socket.htonl(1024)
将32位网络字节序转换为本地
socket.ntohl(8)
bcd-lsp
socket
网络间通信的手段,是一个io接口规范。在linux下socket本身是一种文件类型 叫做 套接字文件 类似 open产生的文件描述符
套接字的分类
流式套接字(SOCK_STREAM)
提供了面向连接的传输服务,在传输层使用TCP协议通信
数据报套接字(SOCK_DGRAM)
提供了面向无连接的服务,在传输层使用UDP协议通信
原始套接字(SOCK_RAW)
针对底层协议编程的,如IP,ICMP的直接访问。我们一般用不到,主要用作交换机等偏网络设备的编程
面向连接 :可靠的传输服务,需要先建立网络之间的连接关系(三次握手)。数据无丢失,无差错,无重复,无失序
面向无连接 :数据发送前不需要先确定连接。数据的传输是不可靠的,有可能产生丢失,重复,或者失序。
TCP网络通信
适用情况:
1.传输质量要求较高
2.数据的传输量较大,并且需要可靠性支持
要求:过程能够描述,顺序能够掌握,每一步什么目的能够知晓
建立连接的过程(三次握手)
断开连接的过程(四次挥手)
socket tcp通信的过程
tcp粘包
指的是发送方发送若干数据包的时候,因为是数据流的方式导致数据粘连在一起,从缓冲区接收后后一数据紧挨着前一数据
如果是大文件分组发送时我们不需要处理,但是如果是若干不相干文件进行分别发送那么就需要处理粘包问题
处理粘包的方法:
1.格式化数据 将数据格式加以规定,可以规定字节数或者规定以什么结尾
2. 发送长度 将数据长度作为发送内容
3.每次发送后有一个短暂的延迟操作。不适合大量数据的多次的发送
交换机 : 大型路由器