day28 网络编程
网络编程
什么是网络编程?
编写基于网络的应用程序的过程称之为网络编程
一.CS构架
C/S构架 服务器和客户端之间用网线连接 提供数据的计算机称为服务器,访问数据的计算机称为客户端
二.网络通讯的基本要素
两台计算机想要通讯,必须具备两个基本要素
1.物理连接介质,包括网线,无线电,光纤等
2.通讯协议
三.网络通讯协议
OSI七层模型
1.什么是OSI?
开放式系统互联网通讯参考模型
OSI把整个通讯过程划分为七层,简称OSI七层模型
①应用层②表示层③会话层④传输层⑤网络层⑥数据链路层⑦物理层
①②③统称为应用层
物理层
物理连接介质
物理层的功能:基于电子器件发送电流信号,根据电流的高低可以对应到数字0和1,也就是二进制数据
数据链路层
单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
以太网协议:
一组电信号构成一个数据包,叫做帧
每一数据帧分成:报头head 和 data数据两部分
head包含:发送者/源地址(6字节),接受者/目的地址(6字节),数据类型(标签+以太类型)(6字节)
data包含:数据包的具体内容(56-1500字节)
MAC地址:源地址和目标地址
每个电脑必须由mac地址,它是全球唯一的
广播:有了mac地址同一网络内的两台主机就可以通讯了
广播太多会造成广播风暴 交换机会自动学习 会降低广播的次数
数据帧:head:源mac地址,目标mac地址 data:01001010
网络层
IP协议:规定网络地址的协议叫IP协议,它定义的地址称为IP地址 范围:0.0.0.0-255.255.255.255
一个IP地址通常写成四段十进制
子网掩码:任意两个IP地址是否属于同一子网络
ARP协议:通讯是基于mac的广播方式实现的.计算机在发包时,获取自身的mac是容易的,如何获取目标主机mac,就需要通过ARP协议.
数据报: 同一子网 :源IP 源MAC 目标的MAC 目标的IP 数据
不同子网 :源IP 源MAC 目标MAC 对方的网关地址 数据
传输层
工作在传输层的两个协议 TCP/UDP
网络层的IP帮我们区分了子网,以太网的mac帮我们找到了主机,如何识别主机上的应用程序,这就需要端口,端口即应用程序与网卡关联的编号.
传输层功能:建立端口与端口的通讯 端口范围:0-65535,0-1023为系统的占用端口
端口号在同一层计算机中不能重复
注意:不要使用常见的程序已经占用的端口 比如:apache 是8080,mysql是3306,FTP是21
这一堆网络协议 本质就是做两件事情:
1.如何找到对方
2.数据如何发送
Ip用来标识一个局域网中的一台电脑 端口用于标识某个应用程序 这样我们就可以准确定位到某个计算机中的某个程序
TCP是一种可靠的传输协议,可以保证数据传输是完整的
如何保证数据传输是完整的?
TCP在传输数据前 会经过一个三次握手的过程 来验证数据传输是否可靠
TCP三次握手解释:①客户端(client)先发一个数据syn=1 ②服务器(server)返回一个确认信息确信我收到了ack=2,然后给客户端发送一个数据syn=1 ③客户端返回一个确认信息 ack=2
连接是虚拟概念不实际存在
TCP四次挥手 断开连接:①客户端先发一个结束请求fin=1 ②服务器返回一个确认的信息表示我收到了ack=2 ③服务器思考了一段时间确认结束,给客户端发送一个结束请求fin=1 ③客户端返回一个确认信息表示我收到了ack=2
四次分手也是保证数据传输是完整的
在三次握手时,的确保证了数据传输是可靠,但是后续有可能由于种种原因例如网络中断,丢包等等,导致数据不完整
TCP的解决方案
每次发送数据报,都需要对方返回一个确认信息,如果一段时间后,对方没有返回,就重复发送,直到重试的次数超过某个指定的值,就判断连接已经丢失
TCP的优点: 可以保证数据完整性
缺点:由于需要接收确认信息,所以整体传输效率较低
四.socket
什么是socket?
socket是Python提供的一个模块,当然其他任何语言都有
用来处理网络传输相关的操作,其实就是封装了底层复杂,丑陋的TCP和UDP协议,对外提供简单优雅的使用接口
socket的作用:减少网络编程的工作量
如何使用?
默认使用的是TCP协议
cs构架的程序必然有客户端程序和服务端程序
为了同一方法,服务器和客户端使用的都是socket
socket服务器
import socket
#创建socket对象
server=socket.socket()
#作为服务器必须为socket指定ip和端口
server.bind(('192.168.12.207',4554))#明确饭店地址
server.listen() #监听端口,饭店们开了
#接受顾客的连接请求
client,address =server.accept()
#接受
data=client.recv(1024)
print(data.decode('utf-8'))
#发送
client.send('我是你的服务器'.encode('utf-8'))
#收发数据都是bytes类型,收发数据都是客户端的socket完成的,服务端的socket只做数据处理
#关闭socket 回收资源
server.close()
socket客户端
import socket
#创建socket对象
client=socket.socket()
#连接服务器 就是在做三次握手
client.connect(('192.168.12.207',4554))
#收发数据
client.send('你好'.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
#关闭连接 就是在做四次挥手
client.close()
day28 网络编程的更多相关文章
- 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块
前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
随机推荐
- cookie之三天免登录代码
LoginCookie.java 1 package com.bjsxt.cookie; import java.io.IOException; import java.net.URLDecoder; ...
- jQuery-点击查看联系方式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- big and little endian
总是容易搞混big endian 和 little endian,但是找到一篇文章,其解释让人耳目一新. 文章链接:http://www.cs.umd.edu/class/sum2003/cmsc31 ...
- django 设置不带后缀的访问路径
在urls.py 设置空路径,并指向对应的html文件 url(r'^$', views.index),
- WebStorage (1) 实例
实例代码 <p>本页面每5秒刷新一下,这是您第<mark></mark>次进入本页面!</p> <script> if (window.lo ...
- JavaScript-----截取字符串的常用方法
1.substring(start,stop) 用于提取字符串中介于两个指定下标之间的字符 start 必需,一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置 ...
- NSThread(II)
非线程安全 //初始化火车票数量.卖票窗口(非线程安全).并开始卖票 - (void)initTicketStatusNotSave { // 1. 设置剩余火车票为 50 self.ticketSu ...
- Linux服务器下jdk 安装与环境变量的配置
1,Oracle 官网下载jdk Linux版本 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...
- 安卓apk的编译与反编译
原文:https://blog.csdn.net/baidu_33870664/article/details/80186945 android基于java的,而java反编译工具很强悍,所以对正常a ...
- 移动端点击返回时强制页面刷新解决办法(pageshow)
在做移动端项目的时候经常遇到这样一个功能比如: 返回后页面不刷新,一些失效的信息依然显示在页面上.这个问题在iphone手机上会出现,在Android手机上返回时会自动刷新(由于手机机器种类不多,无法 ...