1,七层网络协议

应表会传网数物:

应用层、表示层、会话层 (这三层又可以合并为应用层,这样就是五层网络协议【osi五层协议】) python '你好'.encoding('utf-8')

传输层、 预备如何传输、使用的端口 (port,tcp,udp) 四层路由器,四层交换机

网络层、 ip (ipv4 ipv6) 路由器,三层交换机

数据链路层、 mac (mac, arp协议:可以通过ip找到mac) 二层交换机,网卡(单播、广播、组播,arp用到单播和广播)

物理层 转成电信号

2,TCP/UDP

tcp需要先建立连接,然后才能够通信(类似于打电话)

  • 占用连接,可靠(消息不会丢失),实时性高,慢(效率低、面向连接、可靠、全双工)
  • 三次握手
    • 客户端向服务器端发送syn请求
    • 服务端回复ack并发送syn请求
    • 客户端接收到请求后再回复ack,连接建立
      • 在socket中是由 客户端connect() 和 服务端accept()两个命令完成的
  • 四次挥手
    • 客户端向服务端发送fin请求
    • 服务端回复ack确认
    • 服务端向客户端发送fin请求
    • 客户端回复ack确认
      • 在socket中是由 客户端sk.close() 和 服务端 conn.close()两个命令完成的
      • 挥手时服务端的ack和fin不能同时发送,因为客户端发送完所有信息时,服务端不一定完成了所有信息的发送

udp不需要建立连接,就可以通信(类似于发信息)

  • 不占用连接,不够可靠(消息因为网络不稳定可能丢失),实时性不高(效率高、无连接的、不可靠的)

3,例子

'''
------------------------------
TCP协议
------------------------------
'''
'''server'''
import socket sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen() conn, addr = sk.accept()
conn.send('你好'.encode('utf-8'))
msg = conn.recv(1024)
print(msg.decode('utf-8'))
conn.close() sk.close() '''client'''
import socket sk = socket.socket()
sk.connect(('127.0.0.1', 6000)) msg = sk.recv(1024)
print(msg.decode('utf-8'))
sk.send('再见'.encode('utf-8')) sk.close() '''
------------------------------
UDP协议
------------------------------
'''
'''server'''
import socket sk = socket.socket(type=socket.SOCK_DGRAM) #SOCK_DGRAM udp default tcp
sk.bind(('127.0.0.1', 6000)) # msg = sk.recv(1024)
# print(msg.decode('utf-8')) while True:
msg = sk.recvfrom(1024)
print(msg)
print(msg[0].decode('utf-8'))
if msg[0].decode('utf-8') == '对方和你断开了连接':
continue
msgSend = input('>>>')
sk.sendto(msgSend.encode('utf-8'), msg[1]) '''client'''
import socket sk = socket.socket(type=socket.SOCK_DGRAM)
server = ('127.0.0.1', 6000) while True:
msgSend = input('>>>')
if msgSend.upper() == 'Q':
sk.sendto('对方和你断开了连接'.encode('utf-8'), server)
break
sk.sendto(msgSend.encode('utf-8'), server)
msg = sk.recv(1024).decode('utf-8')
if msg.upper() == 'Q':
print('对方和你断开了连接')
break
print(msg)

4,粘包

只出现在tcp协议中,因为tcp协议中多条消息之间没有边界,并且还有各种优化算法,因此会导致发送端和接收端都存在粘包现象:

发送端:两条消息很短,而且发送的间隔时间也很短

接收端:多条消息没有及时接收,而在接收方的缓存堆在一起导致粘包

'''server'''
import socket sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen() conn, addr = sk.accept()
conn.send(b'hello')
conn.send(b'byebye') conn.close()
sk.close() '''client'''
import time
import socket sk = socket.socket()
sk.connect(('127.0.0.1', 6000)) time.sleep(0.1)
msg = sk.recv(5)
print(msg)
msg = sk.recv(4)
print(msg) sk.close()

解决粘包问题的本质:设置边界(发送长度、发送消息,交替进行)

1,自定义协议

'''server'''
import socket sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen() conn, addr = sk.accept()
msg1 = input('>>>').encode('utf-8')
msg2 = input('>>>').encode('utf-8') def sendFunc(msg):
num = str(len(msg))
ret = num.zfill(4)
conn.send(ret.encode('utf-8'))
conn.send(msg)
sendFunc(msg1)
sendFunc(msg2) conn.close()
sk.close() '''client'''
import socket sk = socket.socket()
sk.connect(('127.0.0.1', 6000)) def receiveFunc():
num = sk.recv(4).decode('utf-8')
msg = sk.recv(int(num))
print(msg.decode('utf-8')) receiveFunc()
receiveFunc() sk.close()

2,struct模块

import struct
'''~2**32, 排除符号位,相当于1G的数据的长度''' num1 = 1231341234
num2 = 1342342
num3 = 12 ret1 = struct.pack('i', num1)
print(ret1)
print(len(ret1))
ret2 = struct.pack('i', num2)
print(ret2)
print(len(ret2))
ret3 = struct.pack('i', num3)
print(ret3)
print(len(ret3)) ret11 = struct.unpack('i', ret1)
print(ret11)
print(type(ret11[0]))

python10-网络编程的更多相关文章

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

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

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

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

  3. Linux Socket 网络编程

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

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

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

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

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

  6. C++11网络编程

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

  7. Java - 网络编程

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

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  10. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

随机推荐

  1. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  2. 【python】Leetcode每日一题-螺旋矩阵2

    [python]Leetcode每日一题-螺旋矩阵2 [题目描述] 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . ...

  3. 是时候学习Linux了

    前言: Linux是一个开源.免费的操作系统.其稳定性.安全性.处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上.如果你还不太了解Linux,希望本篇文章能够带你 ...

  4. 最优运输(Optimal Transfort):从理论到填补的应用

    目录 引言 1 背景 2 什么是最优运输? 3 基本概念 3.1 离散测度 (Discrete measures) 3.2 蒙日(Monge)问题 3.3 Kantorovich Relaxation ...

  5. 【Matlab】BFSK的调制与解调仿真

    写在前面 本篇是[Matlab]BASK的调制与解调仿真的下篇,考虑到阅读体验,故另开一篇分享将BFSK的调制与解调仿真. 索引 写在前面 一.BFSK的调制 1.1 异频载波生成 1.2 信号合并 ...

  6. getInstance()得理解

    使用getInstance()方法的原因及作用 https://www.cnblogs.com/roadone/p/7977544.html 使用getInstance()方法的原因及作用 https ...

  7. [刷题] 1016 部分A+B (15分)

    思路 以字符串形式接收 遍历字符串,组装数据,输出结果 #include <iostream> using namespace std; int main() { string a, b; ...

  8. 联想 lenove 3750 M4服务器更改启动项和管理口IP

    联想 lenove 3750 M4服务器更改启动项和管理口IP 注: 因为在机房拍照的原因,再加上工作比较忙:整理成文档的时候有的过程已经忘记了,所以有的步骤可能会缺失,里面的选项都已经用中文方式表达 ...

  9. Centos7 网卡DHCP重新获取IP地址

    问题:局域网内一台linux系统(Centos7.4)DHCP自动获取的IP地址和另一台手动配置的静态IP冲突了 解决方法:让DHCP自动获取的IP地址重新获取一个别的IP地址 DHCP重新获取IP ...

  10. C语言编程 菜鸟练习100题(11-20)

    [练习11]计算 int, float, double 和 char 字节大小 0. 题目: 计算 int, float, double 和 char 字节大小 1. 分析: 使用 sizeof 操作 ...