TCP/IP基础&pysocket

2023-11-12

TCP/IP基础&pysocket

1.网络简述

  • 网络 : 计算机网络功能主要包括实现资源共享,实现数据信息的快速传递。

  • 网络协议:在网络数据传输中,都遵循的执行规则,规范

  • C/S

    服务器(Server) 向客户端提供资源,保存客户端数据,处理客户端请求等。

    客户端(Client) 收集客户请求,提交给服务器

2. OSI 6

(Open System Interconnection Reference Model)

​ 7 Application 各种应用
​ 6 Presentation 数据格式化,加密,压缩解压 (数据处理)
​ 5 Session 建立,管理,终止 引用之间的会话连接 (会话)

​ 4 Transport 提供端到端的服务(UDP/TCP)
​ 3 Network 逻辑寻址,路由选择 IP
​ 2 DataLink 将数据封装成帧
​ 1 Physical 介质上传输比特bit ,提供物理的实现

3. TCP/IP 4

765 应用层 Telnet(远程) FTP(文件传输) SMTP(邮件传输)
DNS (域名服务器) HTTP(超文本传输协议)

4 传输层 TCP(传输控制协议,流式),UDP(用户数据报协议,包式)

3 网络层 IP(互联网协议地址) ,ARP(地址解析协议),RARP(反向地址 解析协议) ,ICMP(控制报文协议)

应用层工程师的工作:
    1.编写应用功能(功能实现)
    2.明确对方地址(IP地址)
    3.选择传输服务(配置好传输层所认可的TCP或UDP)

4.网络地址

通信地址 = IP + port

4.1 IP

即在网络中标识一台计算机的地址编号。
(在同一网段下唯一)

IPv4 : 192.168.1.5 (0-255
IPv6 :fe80::80a:76cf:ab11:2d73 (4个16进制数

公网IP,互联网上的公共IP地址
内网IP,局域网络内由网络设备分配的IP地址。

4.2 port

根据TCP/IP 协议 其首部分配了16位来填写端口
所以 2^16即为65535
0-1023 为系统占用
1024-65535 为用户使用

Socket in py

  • 套接字(Socket) : 实现网络编程进行数据传输的一种技术手段,
  • 套接字***上联应用进程,下联网络协议栈***,(中间虚拟层)是应用程序通过***网络协议***进行***通信***的***接口***,是应用程序与***网络协议根***进行交互的接口
  • 允许数据丢失

相当于在 765 应用层 与 4 传输层 之间添加了一个Socket抽象层,Socket其实就是一个门面模式,***它把复杂的TCP/IP协议族隐藏在Socket接口后面,***对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

1. UDP socket

User Data Protocol,用户数据报协议

#server
from socket import *
sockfd=socket(AF_INET,SOCK_DGRAM)
#返回值: 套接字对象

#服务器绑定地址
addr = ('0.0.0.0',8888)
sockfd.bind()

#消息收发
data,addr = sockfd.recvfrom(buffersize)
    功能: 接收UDP消息(堵塞函数)
    参数: 每次最多接收多少字节
    返回值:addr  消息发送方地址
    
n = sockfd.sendto(data,addr)
    功能: 发送UDP消息
    参数: data  发送的内容 #bytes格式
          addr  目标地址
    返回值:发送的字节数
#关闭socket
  sockfd.close()

udp特点

  • 可能会出现数据丢失的情况
  • 传输过程简单,实现容易
  • 数据以数据包形式表达传输
  • 数据传输效率较高

2. TCP socket

Transmission Control Protocol 传输控制协议

#server
from socket import *
#抽象socket层
sockfd=socket(AF_INET,SOCK_STREAM)
#服务器绑定地址
addr = ('0.0.0.0',8888)
sockfd.bind()
#确定监听队列大小
#一个listen最多连接1024个
sockfd.listen(n)
#-------------------------
#socket重生成客户端 连接套接字
#阻塞等待处理客户端connect请求
connfd,addr = sockfd.accept()

#消息收发
data,addr = connfd.recv(buffersize)
n = connfd.send(data,addr)

#关闭socket
connfd.close()
sockfd.close()

#fd file descriptior 文件描述符
#client
class Dialog_client():
    # 初始化配置客户端,连接服务器
    def __init__(self):
        self.S_ADDR = ('127.0.0.1', 65534)
        self.socket_c = socket(AF_INET, SOCK_STREAM)
        
    # 收集用户消息,发送给服务器,再接收服务器回消息
    def sent_req(self):
        req_input = input("你想问什么?")
       #tcp需要建立连接,socket.connect(s_addr)
       self.socket_c.connect(self.S_ADDR)
       self.socket_c.send(req_input.encode())
        
        answer = self.socket_c.recv(1024)
        print(answer.decode())
        self.socket_c.close()

### 2.1 TCP 流程

三次握手,四次挥手

  • 建立连接

    1. client--> server
      SYN=1 ;seq = x

    2. client < --server
      SYN=1 ;ACK =1;ack = x+1;seq = y

    3. client --> server

    ​ ACK=1 ;ack = y+1


  • 断开连接(CS端都可以发起)

    1. client--> server
      FIN=1 ;seq = x

    2. client < --server
      ACK=1;ack=x+1; seq=y

    3. client < --server

      FIN=1;ACK=1;ack = x+1;seq =z

    4. client--> server

      ACK=1;ack=z+1;seq=h

2.2 标志含义

  • SYN(synchronization) 发起同步标志
    SYN=1,ACK=0 为发起连接方
    SYN=1,ACK=1 连接方同意连接

  • ACK(acknowledgment) 接收标志
    连接建立后所有的传送的报文段都必须把ACK置为1

  • FIN(finish) 释放连接标志
    双方互发FIN=1,则连接将要被释放

  • seq(sequence) 序号

    TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。

    例如,一报文段的序号是301,而接待的数据共有100字节。这就表明本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。
    
  • ack(acknowledgment) 确认号
    期望收到对方下一个报文段的第一个数据字节的序号seq+1

比如第一次发送端传送数据seq=1,发送数据725byte,则下一次发送端的seq为726))

ack取决于发送过来数据的大小 比如初始发送了42byte,此时回送的ack为43(表示<43的数据已全部确认(累积确认)期望收到序号为43的包)

2.3 TCP socket细节

2.3.1 异常断开
  • tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回***一个***空字串。

  • tcp连接中如果一端已经不存在,仍然试图通过send向其发送数据则会产生BrokenPipeError.

  • 一个服务端可以同时连接多个客户端,也能够重复被连接(建立连接一次断开,短连接)

2.3.2 TCP粘包问题

发的快,读的慢,存在系统缓存区

原因:1.操作系统设置了缓冲区
   2.导致消息收发速度不一致
3.字节流方式,不区分消息边界

影响: 如果***每次发送内容是一个独立的含义***,需要接收端独立解析,此事粘包导致含义混合.

解决: 1.消息格式化处理,添加消息边界
     2.控制发送的速度

数据传输流程

1.程序发送消息,逐层添加首部***信息,最终在物理层发送***消息包

2.发送的消息经过多个节点(交换机,路由器)传输,最终到达目标主机。

3.目标主机由物理层逐层解析***首部消息包***,最终到应用程序呈现消息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/IP基础&pysocket 的相关文章

  • 学习Linux命令的正确姿势

    大家好 我是良许 大家应该注意到了 最近我的公众号文章末尾都挂着自己录制的 Linux命令从小白到大神 课程 这个课程我从开始录制到制作完成 足足花了一个半月 如果加上前期的资料收集与教案准备 肯定有将近三个月 首先跟大家讲讲我为什么要开发
  • 电器元件——LM7805

    LM7805是一款常用的线性三端稳压IC 其外形封装虽然有多种 但输出电压皆为5V 区别就是封装不同 最大输出电流可能不一样 最常用的是如下图所示的TO 220封装的7805 TO 220封装的7805 上图所示的这种封装的7805 最高输
  • 设计模式 - Provider Pattern(提供者模式)

    设计模式 Provider Pattern 提供者模式 作者 webabcd 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml

随机推荐

  • tcpreplay-tcprewrite

    1 介绍 参考链接 https www cnblogs com zlslch p 7325599 html utm source itdadao utm medium referral tcpreplay是一种pcap包的重放工具 它可以将
  • 【OpenCV】形态学图像处理学习笔记

    目录 腐蚀操作 膨胀操作 开运算操作 闭运算操作 梯度运算操作 礼帽运算操作 黑帽运算操作 腐蚀操作 cv2 erode 图像对象 内核 卷积核 interations 内核 核越大 腐蚀程度越高可自行定义 例如 kernel np one
  • Java面试题--shiro

    Shiro可以做哪些工作 Shiro可以帮助我们完成 认证 授权 加密 会话管理 与Web集成 缓存等 shiro有哪些组件 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权
  • PG数据库恢复指定错误备份文件时怎么解决

    项目场景 测试环境中对分库分表PG库的同步数据 表结构等操作 问题描述 当我们在给分库分表执行备份恢复时 把不是本分片库的备份文件导入至本分片库 导致数据错乱 比如我们将一个8分库 0 7 的备份文件命名为dump 0 ddl dump 1
  • Sqli-labs之Less-20和Less-21和Less-22

    Less 20 基于错误的cookie头部POST注入 首先从已知的条件中我们知道这又是一道 头部注入 那么我们先输入正确的用户名和密码看一下登录成功是什么样子的 回显有User Agent IP这样从当次Request直接获取的 也有Co
  • 兴业银行利用以太坊区块链发行债券,金融科技冲击下的银行业未来(上篇)

    点击上方 蓝色字 可关注我们 暴走时评 日前 兴业银行通过以太坊区块链发行了类证券代币的债券 兴业银行的举动可能意味着银行承认 即使比特币或以太等无许可协议可能会带来颠覆性的威胁 他们依旧无法放弃其中潜在的巨大机遇 作者 Michael J
  • PHP+Laravel框架RabbitMQ简单使用

    RabbitMQ安装教程请转到 RabbitMQ安装教程 超详细 1 创建生产者 在app Http Controllers里创建一个php控制器文件 namespace App Http Controllers use App Http
  • docker中安装jupyter,并远程打开jupyter

    一 拉取镜像 拉取一个自带miniconda的镜像源 docker pull continuumio miniconda3 二 启动容器 docker run id p 宿主机端口 容器端口 name 自己取的容器名 v 宿主机目录 容器目
  • Python 综合应用小项目一

    数据库报错重连机制 利用异常捕获来获取mysql断开的报错 然后再重连 1 import MySQLdb as mysql 2 3 class DB 4 def init self host user passwd db name 5 se
  • 基于spring validation多层对象校验

    1 第一层对象定义 package com ybw validation demo vo import lombok AllArgsConstructor import lombok Data import lombok NoArgsCon
  • idea workspace.xml 报错

    1 找到 workspace xml 位置并删除 2 重新install
  • LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述

    一 github GitHub RobustFieldAutonomyLab LeGO LOAM 二 安装依赖 1 ROS Ubuntu 64 bit 16 04 ROS Kinetic 比较常规 就不赘述了 2 gtsam Georgia
  • 集合引用类型 上

    目录 Object Array 创建数组 数组的静态方法 数组空位 数组索引 检测数组 迭代器方法 复制和填充方法 转换方法 栈方法 队列方法 排序方法 操作方法 搜索和位置方法 迭代方法 归并方法 Object 显式地创建Object 的
  • Windows7 Python3 搭建Scrapy 爬虫框架

    Windows7 64位 Python3 7 安装Scrapy 提示如下错误信息 解决办法 1 在python库中下载twisted相应的包 whl文件 官网地址 https www lfd uci edu gohlke pythonlib
  • Android底部导航栏的三种风格实现

    一 效果图展示 如果动图没有动的话 也可以看下面这个静态图 以下挨个分析每个的实现 这里只做简单的效果展示 大家可以基于目前代码做二次开发 二 BottomNavigationView 这是 Google 给我们提供的一个专门用于底部导航的
  • JWT 登录认证及 token 自动续期方案解读

    欢迎关注方志朋的博客 回复 666 获面试宝典 方志朋 号主为CSDN博客之星 博客访问量突破一千万 著有畅销书 深入理解SpringCloud与微服务构建 主要分享Java 后端架构等技术 用大厂程序员的视角来探讨技术进阶 面试指南 职业
  • 昨天看了一本c#的教程

    昨天看了一本c 的教程 昨天看了一本c 的教程 那是本很早前就买了的书 虽然也不是没看过 但是昨天重新看了下 感觉收获还是不小的 从c 的类型 到它的方法 还有就是面向对象的一些概念 覆盖 继承 我不敢说我学到了多少 但是我很喜欢 post
  • 2024年计算机专业毕业设计题目大全-吊炸天的2024届计算机毕业设计选题推荐参考

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 JavaWeb项目 微信小程序项目 Python
  • openwrt编译ipk包提示缺少feeds.mk文件

    问题具体表现如下 这个问题困扰了我两个多星期 总算解决了 解决方案如下 首先 先应该把配置菜单调好 我的硬件是7620a 要编译的ipk包为helloworld 所以应该使用 make menuconfig命令进入配置菜单 进入后 将1号框
  • TCP/IP基础&pysocket

    TCP IP基础 pysocket 1 网络简述 网络 计算机网络功能主要包括实现资源共享 实现数据信息的快速传递 网络协议 在网络数据传输中 都遵循的执行规则 规范 C S 服务器 Server 向客户端提供资源 保存客户端数据 处理客户