网络编程

什么是网络编程?

编写基于网络的应用程序的过程称之为网络编程

一.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 网络编程的更多相关文章

  1. 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块

    前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  2. 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用

    一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...

  3. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  4. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  5. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  6. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  7. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  8. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  9. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

随机推荐

  1. 本地tp项目上传服务器报runtime/cache错误

    很简单,给runtime权限777 就好了 chmod -r 777 runctime

  2. c#除掉字符串最后一个字符几种方法

    有一数组:转换为字符串后为 aaa|bbb|ccc|ddd| 现要去掉最后一个| 第一种方法: 语句为:str1=aaa|bbb|ccc|ddd| str=str1.substring(0,lasti ...

  3. 前端流程图jsplumb学习笔记

    1.这篇博客很好,另外两个是官网文档 http://www.cnblogs.com/leomYili/p/6346526.html https://jsplumbtoolkit.com/communi ...

  4. python 数据较大 性能分析

    前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...

  5. 06 str() bytes() 编码转换

    x = str() #创建字符串#转换成字符串,字节,编码 m = bytes()#创建字节#转换成字节,字符串,要编程什么编码类型的字节 a = "李露" b1 = bytes( ...

  6. Toolkit tool 获取屏幕、显示在屏幕中心

    2018-11-11  15:30:05开始写 Toolkit tool = Toolkit.getDefaultToolkit(); Dimension d = tool.getScreenSize ...

  7. JavaBean和List<JavaBean>

    2018-11-04 23:04:03开始写 返回泛型为User是列表 public List<User> getUserInfo() { conn = getConn();//获取数据库 ...

  8. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  9. GUI常用对话框3

    %进度条 %waitbar h=waitbar(,'实例'); get(h); %获得进度条的子对象 get(get(h,'Children')) ha=get(h,'Children'); %获得坐 ...

  10. router.go,router.push,router.replace的区别

    除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现.当你点击 <router-link> 时,这个 ...