查看ip
windows
win + r
输入cmd -> enter
ipconfig
linux
在shell 命令行输入 : ifconfig
osi模型(面试常用)
是网络传输的一个标准化模型,是计算机网络体系结构发展的产物
应用层 : 提供OSI的用户服务,例如处理程序,文件传输协议和数据管理。
表示层 :完成数据的转换和文本压缩加密
会话层:提供进程间的连接建立,选择使用什么样的传输层协议
传输层 :建立网络连接,提供适合的传输服务,提供透明的传输服务,提供端到端的流量控制
网络层 :控制分组传送,路由选择,网络互连。
链路层 : 提供链路的交换,具体的数据发送功能
物理层 : 物理硬件,提供具体的传输条件和传输接口规定
实际应用
网络四层模型 -- > 基于osi七层模型进行实际情况的整合
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层 : 链路层 物理层
协议:网络协议,是通信双方必须共同遵循的一个约定。如怎么建立连接,怎么进行识别
tcp协议 : 传输控制协议 传输层
udp协议 : 用户数据报协议 传输层
ip 协议 : 网间协议 网络层
http协议: 超文本传输协议 应用层
预备知识 :
主机 :
获取主机名
import socket
# 获取当前主机主机名
In [2]: socket.gethostname()
Out[2]: 'tedu'
# 解析服务器主机名,转变为数字地址
In [3]: socket.gethostbyname('localhost')
Out[3]: '127.0.0.1'
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通信的过程
服务器端
1.创建套接字(流式套接字)
from socket import *
socket(socket_family=AF_INET,socket_type=SOCK_STREAM,protocol=0)
功能:创建socket套接字
参数:sock_family:AF_INET AF_UNIX 地址族类型
socket_type: SOCK_STREAM(流式套接字)
SOCK_DGRAM(数据包套接字) 套接字类型
protocol:一般使用默认值
返回值:返回创建的套接字
2.绑定服务器端的ip和端口号
sockfd.bind((host,port))
3.将套接字设置为监听套接字,并且创建监听队列大小
sockfd.listen(num)
4.阻塞等待接收客户端连接请求
connfd,addr = sockfd.accept()
5.接收发送消息
connfd.send()
connfd.recv()
6.关闭套接字
connfd.close()
sockfd.close()
4:40
tcp 客户端流程
1.创建socket套接字
2.发起连接请求
sockfd.connect(ADDR)
3.接收发送消息(需要和服务器端发送接收相匹配)
connfd.send()
connfd.recv()
4.关闭套接字
sockfd.close()
tcp粘包
指的是发送方发送若干数据包的时候,因为是数据流的方式导致数据粘连在一起,从缓冲区接收后后一数据紧挨着前一数据
如果是大文件分组发送时我们不需要处理,但是如果是若干不相干文件进行分别发送那么就需要处理粘包问题
处理粘包的方法:
1.格式化数据 将数据格式加以规定,可以规定字节数或者规定以什么结尾
2. 发送长度 将数据长度作为发送内容
3.每次发送后有一个短暂的延迟操作。不适合大量数据的多次的发送
作业 :
写一个简单的文件服务器
server 端
client 端
1.先运行server
2.运行client的时候呈现一个简单的界面 print打印即可
3.实现的功能 1.list 2 get 3 put 4 quit
1. 显示出所有服务器端文件的名字
2. get filename 下载服务器端的某个文件
3. put filename 上传客户端的某个文件