1、网络通信原理

  互联网的本质就是一系列的网络协议, 统称为互联网协议.

  互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。

  互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层.

  对于tcp\ip 五层协议, 每层运行常见物理设备有以下几种:

2、tcp\ip五层协议模型讲解 

    我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议就理解了整个互联网通信的原理.

    首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解.

    每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件.

  2.1  物理层

    孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网.

    物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

  2.2  数据链路层

    单纯的电信号0和1没有任何意义,必须规定电信号多少位一组.

    数据链路层的功能:定义了电信号的分组方式.

    以太网协议----ethernet

       以太网协议规定: 一组电信号组成一个数据包(叫做帧), 每一帧数据由报头(head)和数据体(date)组成.

       

       报头(18个字节): 源Mac地址+目标Mac地址+数据类型

       data数据包含: (最短46字节,最长1500字节)

       每组数据包的大小: head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

    通信方式: 广播     

      ethernet(以太网) 采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼. 这个包会以广播的方式在发送端所处的子网内传输, 所有主机接收后拆开包, 发现目标ip为自己的, 就响应, 返回自己的mac.

  2.3  网络层  

    有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,数以万计的机器发送巨量的包不仅会造成网络拥堵瘫痪, 而且数据还不安全.

    网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址.

    IP协议

      规定网络地址的协议叫ip协议, 它定义的地址称之为ip地址, 一个ip地址通常写成四段十进制数,例:172.16.10.1.

      IP协议的作用主要有两个:

        1,是为每一台计算机分配IP地址

        2, 是确定哪些地址在同一个子网络(通过子网掩码和and运算), 如果不是一个子网内的, 就通过Arp协议获取网关的Mac地址.

    IP数据包也分为head和data部分, IP数据包直接放入以太网包的data部分.

      以太网数据包的”数据”部分, 最长只有1500字节. 因此, 如果IP数据包超过了1500字节, 它就需要分割成几个以太网数据包, 分开发送了.

    Arp协议

      计算机通信基本靠吼, 即广播的方式, 所有上层的包到最后都要封装上以太网头, 然后通过以太网协议发送, 以太网通信是基于mac的广播方式实现, 计算机在发包时,获取自身的mac是容易的, 如何获取目标主机的mac, 就需要通过arp协议.

    arp协议功能: 广播的方式发送数据包, 获取目标主机的mac地址.

    具体的IP包长什么样子?

    如果不在同一个子网内, 将IP包里的目标Mac替换成获取到的网关Mac.

  2.4  传输层

    网络层的IP帮我们区分子网, 以太网层的Mac帮我们找到主机, 但是只找到主机没用,程序之间进行的沟通啊像QQ、浏览器和京东服务器, 大家使用的都是应用程序, 你的电脑上可能同时开启qq, 暴风影音等多个应用程序, 那么我们通过IP和Mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

    传输层功能:建立端口到端口的通信(端对端通信)

      注意: 端口范围0-65535,0-1023为系统占用端口

    tcp协议

      TCP把连接作为最基本的对象, 每一条TCP连接都有一个套接字(socket), 端口号拼接到IP地址即构成了套接字, 例如IP地址为192.3.4.16, 而端口号为80, 那么得到的套接字为192.3.4.16:80.当应用程序希望通过 TCP 与另一个应用程序通信时, 它会发送一个通信请求, 这个请求必须被送到一个确切的地址. 在双方“握手”之后, TCP 将在两个应用程序之间建立一个全双工 (full-duplex,双方都可以收发消息) 的通信. 这个全双工的通信将占用两个计算机之间的通信线路, 直到它被一方或双方关闭为止.

    tcp协议和udp协议的对比:

     tcp: 提供的是面向连接、可靠的字节流服务. 当客户和服务器彼此交换数据前, 必须先在双方之间建立一个tcp连接, 之后才能传输数据. tcp提供超时重发, 丢弃重复数据, 检验数据, 流量控制等功能, 保证数据能从一端传到另一端.

     udp: 是一个简单的面向数据报的运输层协议. udp不提供可靠性, 它只是把应用程序传给IP层的数据报发送出去, 但是并不能保证它们能到达目的地. 由于udp在传输数据报前不用在客户和服务器之间建立一个连接, 且没有超时重发等机制, 故而传输速度很快.

    tcp的三次握手,四次挥手?(具体见后章节)

  2.5  应用层

    应用层功能: 规定应用程序的数据格式.

     例:tcp协议可以为各种各样的程序传递数据, 比如Email、WWW、FTP等等. 那么, 必须有不同协议规定电子邮件、网页、FTP数据的格式, 这些应用程序协议就构成了”应用层”.

网络通信之全流程示意图

3、socket

  什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

  基于TCP的socket流程图片

  

  基于UDP的socket流程图片

 # 服务端----------------------------------------------------------------------
import socket server = socket.socket() # 创建一个socket对象
ip_port = ("192.168.15.73",8520) # 给定服务端的IP和端口
server.bind(ip_port) # 服务端绑定IP和端口
server.listen(3) # 服务端监听数量为3个, 即排队人数为3
while 1:
conn,addr = server.accept() # 服务端和客户端之间建立通道
info = "服务端提供服务"
conn.send(bytes(info,"utf8")) # 服务端直接用conn 通道来传输数据(必须是bytes类型), 客户端的话通过客户端对象来传输数据. while 1:
recv_msg = str(conn.recv(1024),"utf8") # 1024b 意思是接收到的最大数据长度为1024b
print(recv_msg)
if recv_msg == "":
break
send_msg = input("服务端输入信息: ")
conn.send(bytes(send_msg,"utf8"))
conn.close() server.close() # 客户端--------------------------------------------------------------------------
import socket client = socket.socket()
ip_port = ("192.168.15.73",8520)
client.connect(ip_port) recv_msg = client.recv(1024)
print(str(recv_msg,"utf8")) while 1:
info = input("客户端输入请求: ")
client.send(bytes(info,"utf8"))
if info == "":
break
recv_msg = client.recv(1024)
print(str(recv_msg,"utf8")) client.close()

socket之tcp协议下的客户端和服务端

 import socket

 # 服务端
server = socket.socket(type=socket.SOCK_DGRAM) # type参数为遵循 udp协议的意思
ip_port = ("127.0.0.1",8520)
server.bind(ip_port) recv_msg,addr = server.recvfrom(1024) # recvfrom接收两个参数, 数据内容和ip+端口号
print(f"服务端收到来自{addr}的信息>>>>",str(recv_msg,"utf8")) send_info = "商城信息balabala......"
server.sendto(bytes(send_info,"utf8"),addr) # 客户端
client = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8520)
client.sendto(bytes("给我你商城的信息","utf8"),ip_port) recv_msg,addr = client.recvfrom(1024)
print("客户端收到来自服务端的信息:",str(recv_msg,"utf8"))

udp协议下的服务端和客户端

练习:

  写一个udp协议下的socket简单聊天工具(类似于QQ)
  1. 服务端
    - 接收客户端发送的信息并作出回复
  2. 多个客户端
    - 客户端向服务端发送信息

 import socket

 # 服务端-------------------------------------------------------------------------
server = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("192.168.12.42",8520)
server.bind(ip_port) while 1:
recv_msg,addr = server.recvfrom(1024)
print(f"一条来自客户端{addr}的消息: {str(recv_msg,'utf8')}")
send_msg = input("输入回复内容: ")
if not send_msg: continue
server.sendto(bytes(send_msg,"utf8"),addr) # 客户端-------------------------------------------------------------------------
client = socket.socket(type=socket.SOCK_DGRAM)
qq_name_dic={
'taibai':('192.168.12.42',8520),
'taihei':('192.168.12.42',8520),
'libai':('192.168.12.42',8520),
'lihei':('192.168.12.42',8520),
}
while 1:
who = input("请选择聊天对象[Q退出对话]: ")
if who == "Q": break
ip_port = qq_name_dic[who]
while 1:
send_msg = input("输入聊天内容[Q结束对话]: ")
if send_msg == "Q": break
if not send_msg or not ip_port: continue
client.sendto(bytes(send_msg,"utf8"),ip_port)
recv_msg,addr = client.recvfrom(1024)
print(str(recv_msg,"utf8"))

udp协议下的聊天工具

python摸爬滚打之day26----网络编程之socket的更多相关文章

  1. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  2. 网络编程之Socket & ServerSocket

    网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...

  3. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  4. [深入浅出Cocoa]iOS网络编程之Socket

    http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   [深入浅出Co ...

  5. 网络编程之Socket代码实例

    网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...

  6. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

  7. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  8. 洗礼灵魂,修炼python(84)-- 知识拾遗篇 —— 网络编程之socket

    学习本篇文章的前提,你需要了解网络技术基础,请参阅我的另一个分类的博文:网络互联技术(4)——计算机网络常识.原理剖析 网络通信要素 1.IP地址: 用来标识网络上一台独立的终端(PC或者主机) ip ...

  9. Python网络编程之socket应用

    1 引言 本篇主要对Python下网络编程中用到的socket模块进行初步总结.首先从网络基础理论出发,介绍了TCP协议和UDP协议:然后总结了socket中的常用函数:最后通过实际代码展示基本函数的 ...

随机推荐

  1. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  2. Canny 边缘检测及相关应用

    该内容为 <学习图像局部特征检测和描述-基于OpenCV源码分析的算法与实现> <OpenCV 3 计算机视觉-Python语言实现> OpenCV官方网站的 https:// ...

  3. C#中[WebMethod]的用法,aspx、ashx、asmx

    在.net 3.5的情况下 前台JQuery做Ajax的时候,服务器端 (1)可以调用aspx.cs 中声明带有[WebMehtod]的public static 的方法(不需要自己手动添加web.c ...

  4. c groups

    https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt https://developer.ibm.com/hadoop/2017 ...

  5. vs code 快捷键中英文对照

    常用 General 按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick O ...

  6. 【iCore1S 双核心板_ARM】例程十八:SD_IAP_FPGA实验——更新升级FPGA

    实验现象及操作说明: 1.烧写程序成功,绿色ARM·LED灯点亮,三色FPGA·LED灯循环点亮,烧写失败,如果挂载SD卡失败,红灯快闪,如果打开文件失败,蓝灯快闪,读取文件指针移动失败,白灯点亮,升 ...

  7. ionic入门教程-ionic路由详解(state、route、resolve)(转)

    http://blog.csdn.net/onil_chen/article/details/51758696?appinstall=0 今天好好的跟大家讲讲ionic的路由配置. 问到的朋友有点多, ...

  8. HAProxy配置说明(转)

    原文地址:http://www.cnblogs.com/sagech/p/5695466.html global # 全局参数的设置 log 127.0.0.1 local0 info # log语法 ...

  9. tomcat 配置 使用综合

    [参考]Tomcat 7.0安装与配置 [参考]tomcat 控制台日志(startup.bat)输出到指定文件中 [参考]将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种 ...

  10. python定义函数时,形参前加*和**的意义

    转发:https://blog.csdn.net/qq_34806812/article/details/82017839 1.加*表示接受一个tuple类型(元组),如: 2.加**表示接受一个di ...