网络:从socket编程的角度说明UDP和TCP的关系,http和tcp的区别

news/2024/5/21 1:16:19/文章来源:https://blog.csdn.net/ResumeProject/article/details/130612428

         尝试从编程的角度解释各种网络协议。

UDP和TCP的关系

        从Python的socket编程角度出发,UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是两种不同的传输协议。

  • TCP是一种面向连接的协议,提供可靠的、有序的、双向的数据传输。在TCP中,客户端和服务器之间首先要建立连接,然后通过该连接进行数据传输,最后再关闭连接。TCP保证数据的可靠性,通过拥塞控制和流量控制等机制来确保数据的有序传输。
  • UDP是一种无连接的协议,提供不可靠的、无序的、面向报文的数据传输。在UDP中,客户端和服务器之间不需要建立连接,可以直接进行数据传输。UDP不保证数据的可靠性,也没有拥塞控制和流量控制等机制,适用于一些实时性要求较高的应用,如流媒体等。

        在Python的socket编程中,可以使用socket模块创建UDP和TCP的套接字进行网络通信。使用UDP套接字进行通信时,可以通过socket的sendto()和recvfrom()方法发送和接收UDP报文。而使用TCP套接字进行通信时,可以通过socket的connect()方法建立连接,然后使用send()和recv()方法进行数据传输。

code

下面是一个使用UDP套接字的示例代码:

import socket# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 发送UDP数据报文
udp_socket.sendto(b"Hello, UDP", ("127.0.0.1", 8888))# 接收UDP数据报文
data, addr = udp_socket.recvfrom(1024)
print("Received:", data.decode())# 关闭UDP套接字
udp_socket.close()

下面是一个使用TCP套接字的示例代码:

import socket# 创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 创建TCP欢迎套接字,使用IPv4协议# 建立TCP连接
tcp_socket.connect(("127.0.0.1", 8888))# 向服务器发起连接,先进行三次握手,然后建立TCP连接# 发送TCP数据
tcp_socket.send(b"Hello, TCP")# 接收TCP数据   从服务器接收信息
data = tcp_socket.recv(1024)
print("Received:", data.decode())# 关闭TCP连接
tcp_socket.close()
import socket 
# 创建TCP套接字
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将TCP欢迎套接字绑定到端口8899
serverSocket.bind(("127.0.0.1", 8888)) # 定义最大连接数
serverSocket.listen(10) 
print("server start")while True:# 接收到客户连接请求后,调用accept()方法,创建新的TCP连接套接字,由这个客户专用;进行握手后建立一个TCP连接connectionSocket, addr = serverSocket.accept() # 获取客户发送的字符串sentence = connectionSocket.recv(1024) # 向用户发送修改后的字符串connectionSocket.send(b"ni hao") # a bytes-like object# 关闭TCP连接套接字connectionSocket.close() 

在这里插入图片描述

  • 类似项目 : 用Python Socket TCP实现的简易Cli聊天室https://github.com/FlyAndNotDown/ChatRoom/blob/master/server/server.py
    在这里插入图片描述

http

  • http协议在ip协议之上对吗?
    无关。我完全可以手写HTTP请求文本,写纸上用邮政寄出去,对方收到后瞪眼法读到内容,把响应同样写在纸上寄回来给我读。全过程没有IP协议参与。

code

  • c++ 一个简单的请求程序

http和tcp的区别

        超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,所以其重点在文本,tcp重点才在传输。
        http协议只是软件之间约定的协议,定义如下格式:

  • 请求行 回车+换行,请求头 回车+换行,请求头 回车+换行 …… 请求头 回车+换行 回车+换行 数据

长连接和短连接

在网络通信中,长连接和短连接是指客户端和服务器之间建立连接的时间长短。

  1. 长连接:长连接是指客户端和服务器之间建立的连接可以长时间保持打开状态。一旦建立了长连接,客户端和服务器可以进行多次的数据传输,而无需每次都重新建立连接。

  2. 短连接:短连接是指客户端和服务器之间建立的连接是短暂的,一旦完成数据传输,该连接就会被关闭。每次通信都需要重新建立连接,传输完成后立即关闭连接。上边的例子就是短链接。

  • 长连接的实现通常需要考虑以下几个方面:
  1. 保持连接:为了实现长连接,客户端和服务器需要保持连接的打开状态。这可以通过客户端和服务器之间发送周期性的心跳信号来实现,以确保连接保持活跃。心跳信号可以是空数据包或特定的控制信息,用于告知对方连接仍然存在。

  2. 连接管理:服务器需要维护并管理客户端的连接状态。这包括向服务器注册连接、断开连接或关闭空闲连接等。服务器需要用数据结构(如哈希表或连接池)来管理连接,以确保有效地处理和响应客户端请求。

  3. 优化网络资源:长连接会占用服务器资源,因此需要对网络资源进行优化。这包括合理限制同时连接的数量,使服务器能够处理其他请求,并对长时间闲置的连接进行关闭或重用。

  4. 异常处理和容错机制:考虑到长连接可能会因为网络中断、服务器故障或其他异常而中断,需要实现异常处理和容错机制。这可以包括重连机制、连接超时判断和恢复机制等,以确保连接的稳定性和可靠性。

  5. 心跳检测:为了保持连接活跃,客户端和服务器可以周期性地进行心跳检测。如果在一定时间内未收到心跳信号,则可以判断连接已断开,进而重新建立连接。

  6. 会话管理和身份验证:在长连接中,对于每个连接,需要进行会话管理和身份验证。这确保只有经过身份验证的用户可以使用长连接,并且可以对每个会话进行个性化的处理。

DNS —— IP地址查询

  • 当用户在浏览器中输入一个域名时,操作系统会向本地的DNS解析器发出DNS查询请求。本地DNS解析器首先会查询本地缓存中是否存在该域名对应的IP地址。如果没有,它将向根域名服务器发出查询请求。根域名服务器会返回一组顶级域名服务器的IP地址,然后本地DNS解析器会发送查询到顶级域名服务器。这个过程会逐级迭代,直到获取到目标域名对应的IP地址。一旦本地DNS解析器获取到了域名对应的IP地址,它会将这个结果返回给操作系统,操作系统再将其传递给用户的应用程序,如浏览器。然后,应用程序可以使用这个IP地址与远程服务器进行通信。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

  • DNS采用了缓存机制,一旦某个域名的解析结果被本地DNS服务器缓存,后续的查询将会更快速,减少了网络延迟。此外,DNS还支持递归查询和迭代查询等技术,可以进一步提高查询效率。如果本地DNS服务器没有缓存某个域名的解析结果,它必须向上层的DNS服务器发出查询请求。这种查询和响应的过程可能会导致一定的查询延迟。

相关项目

  • DNSChef是一种网络安全工具,用于拦截和修改DNS(域名系统)查询和响应,从而实现DNS欺骗的目的。它允许用户将特定的DNS查询重定向到用户自定义的IP地址或域名,从而控制特定的网络通信。

DNSChef的工作原理如下:

  1. DNS查询拦截:DNSChef可以通过在本地计算机上运行作为DNS服务器的代理,拦截目标计算机发送的DNS查询请求。当目标计算机发起DNS查询时,它将查询发送到DNSChef代理,而不是真实的DNS服务器。这样,DNSChef就能够检查和修改该DNS查询。

  2. DNS查询修改:一旦DNSChef捕获到DNS查询请求,它可以根据用户的设置对该查询进行修改。用户可以设置自定义的IP地址,将查询重定向到指定的IP地址。也可以设置自定义的域名,将查询重定向到指定的域名。另外,还可以根据需要修改DNS查询中的其他信息,如TTL(存活时间)等。

  3. DNS响应模拟:除了拦截和修改DNS查询外,DNSChef还可以模拟DNS响应。它可以根据用户的设置生成自定义的DNS响应,并将其返回给目标计算机。这可以用于实现钓鱼攻击、网络监控和调试等用途。

  • https://github1s.com/bigsnarfdude/pythonNetworkProgrammingN00B/blob/master/dnschef.py
  • https://github.com/dweekly/dnschat
  • https://github.com/soobbu/PeerLink

arp —— 物理地址查询

        ARP(Address Resolution Protocol)是用于将IP地址解析为对应MAC地址的协议,它在局域网内部工作。使用 ARP,计算机 A 可以使用 IP 地址向该区域中的每台计算机发送请求(发送方发送ARP请求广播)。如果另一台计算机将 IP 识别为自己的 IP,则可以使用相应的 MAC 地址进行响应。当计算机 A 收到响应时,它知道如何沿数据链路层发送其原始消息。

        下面是ARP的工作过程:

  1. 当一个主机(发送方)要发送数据包到另一个主机(目标方),它首先检查自己的ARP缓存表(ARP Cache),查看是否已经有了目标主机的IP地址对应的MAC地址。如果存在对应的缓存项,发送方就可以直接使用该MAC地址。

  2. 如果ARP缓存中没有目标主机的MAC地址,发送方就会发送一个ARP请求广播包(ARP Request Broadcast)到局域网上的所有主机。该广播包中包含发送方的IP地址和MAC地址。

  3. 收到ARP请求广播的主机(包括目标方和其他主机)会检查自己的IP地址是否与广播包中的目标IP地址匹配。如果匹配,就将自己的MAC地址发送给发送方,构成一个ARP响应(ARP Reply)。

  4. 发送方收到ARP响应后,将目标主机的IP地址和MAC地址保存在ARP缓存表中,以备将来使用。

  5. 一旦发送方获取到目标主机的MAC地址,它就可以构建一个带有目标主机MAC地址的数据包,并将其发送到目标主机。目标主机接收到数据包后,根据自己的IP地址判断是否接收该数据包。

  • 你可能已经注意到了,ARP感觉有点脆弱。任何设备都可以声称与某个IP地址相关联,网络上的其他人都会相信它们。当恶意进行时,这在安全领域是众所周知的 ARP 欺骗攻击。所以IPv6用新协议取代了ARP。

相关项目

  • arpchat|用 ARP 协议实现的在线聊天工具 https://github.com/kognise/arpchat

CG

OSI 的七层模型

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI)

  • 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
数据链路层:负责建立和管理节点间的链路。
网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
会话层:向两个实体的表示层提供建立和使用连接的方法。
表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。

  • 你是如何理解“TCP是面向字节流的协议”的?:UDP协议为应用层提供不可靠、无连接和基于数据报的服务。所以,使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。而TCP协议则完全相反,为应用层提供可靠的、面向连接的和基于流的服务。
  • https://docs.python.org/3/library/socket.html
  • 【巧用wireshark快速找出摄像头ip-哔哩哔哩】 https://b23.tv/vvXMv24
  • https://blog.csdn.net/wj31932/article/details/89634302 单向能ping通,反向不可以多半是防火墙原因
  • 终于有人把tcp、http、rpc和grpc总结完整了
  • 【可视化爬虫EasySpider:一个无需写代码,可视化的几分钟设计一个爬虫的开源免费软件-哔哩哔哩】 https://b23.tv/yhIu5mG
  • 【ICLR-23 Oral 探索网络结构和域泛化能力的关系-哔哩哔哩】 https://b23.tv/6U3xqTW

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_529137.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2000-2022年1km精度人口分布栅格数据(免费获取/全球/全国/分省/分市)

人口空间分布数据是我们在各项研究中经常使用的数据,之前我们给大家分享过2000-2021年来自LandScan平台的1km精度的人口分布栅格数据集。LandScan人口数据集由美国能源部橡树岭国家实验室(ORNL)开发,East View Cartographic提供。…

GEE:谐波模型在遥感影像中的应用(季节性变化的拟合与可视化)

作者:CSDN @ _养乐多_ 谐波模型是一种常用的工具,用于拟合和分析影像数据中的周期性和季节性变化。本文将介绍如何使用Google Earth Engine平台实现谐波模型,通过对Landsat影像进行处理和拟合,展示季节性变化的拟合结果,并通过图表和地图可视化展示数据。 谐波模型是一种…

通过easyui实现动态控住表格字段显示、导出表格数据

前言 学过layui前端框架的都知道,layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf:导出按钮的右边那个按钮就是打印pdf的 那么,easyui要怎么实现这些功能呢?这篇文章就…

【小沐学NLP】在线AI绘画网站(网易云课堂:AI绘画工坊)

文章目录 1、简介1.1 参与方式1.2 模型简介 2、使用费用3、操作步骤3.1 选择模型3.2 输入提示词3.3 调整参数3.4 图片生成 4、测试例子4.1 小狗4.2 蜘蛛侠4.3 人物4.4 龙猫 结语 1、简介 Stable Diffusion是一种强大的图像生成AI,它可以根据输入的文字描述词&#…

PS设计技巧01

大部分切图工作都是在PS中完成的 1、如何得知宽度和高度,先截个图: 2、找个文件夹,把截取的图片放进去,然后ctrl o 把图片文件放进去 3、存入图片,我们用的是网页图片,用的是ctrl r键,调出标尺…

leetcode 1290.二进制链表转整数

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;二进制链表转整数 ps&#xff1a; 1 0 1 (0 << 1) 1 0 1 1 (1 << 1) 0 2 0 2 (2 << 1) 1 4 1 5代码&#xff1a; int getDecimalValue(struct ListNode* head) {int ans 0;while(head !…

SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》&#xff1a;让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业&#xff08;餐厅、饭店&#x…

MySQL5.7源码编译Debug版本

编译环境Ubuntu22.04LTS 1 官方下载MySQL源码 https://dev.mysql.com/downloads/mysql/?spma2c6h.12873639.article-detail.4.68e61a14ghILh5 2 安装基础软件 cmakeclangpkg-configperl 参考&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/source-installation-prere…

31 对集合中的字符串,按照长度降序排列

思路&#xff1a;使用集合的sort方法&#xff0c;新建一个Comparator接口&#xff0c;泛型是<String>&#xff0c;重写里面的compare方法。 package jiang.com; import java.util.Arrays; import java.util.Comparator; import java.util.List;public class Practice4 {…

vue列表全选反选

1、结果查看 2、 选中时添加样式 3、点击选择调用方法 4、全选反选调用方法

《HeadFirst设计模式(第二版)》第五章代码——单例模式

代码文件目录&#xff1a; 初始版本&#xff1a; package Chapter5_SingletonPattern.origin;/*** Author 竹心* Date 2023/8/5**/public class Singleton {private static Singleton uniqueInstance;private Singleton(){}public static Singleton getInstance(){if(uniqueIn…

Centos7/8 安装/配置 Redis5

目录 一、安装 Redis 二、创建符号链接 1.针对可执行程序设置符号链接 2.针对配置文件设置符号链接 三、修改配置文件 1.修改 ip 地址 2.关闭保护模式 四、设置工作目录 1.创建工作目录 2.在配置文件中&#xff0c;配置工作目录 五、设置日志文件 1.创建日志目录 2…

hcip——期中小试

要求&#xff1a; 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 O…

设计模式之策略模式(Strategy)

一、概述 定义一系列的算法&#xff0c;把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2.需要使用一个算法的不同变体。…

mysql8查看执行sql记录历史,配置开启sql历史日志general_log

1.概要说明 mysql8默认未开启sql记录历史日志。 2.配置开启general_log 2.1.查看配置 general_log&#xff1a;是否开启sql日志。默认为OFFlog_output:日志输出位置&#xff1a; FILE&#xff1a;输出到文件。默认值TABLE&#xff1a;输出到表。mysql.general_log show v…

【Leetcode】(自食用)LRU算法(哈希链表法)

step by step. 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键…

并查集练习 —岛屿数量(解法一)

题目&#xff1a; 给定一个二维数组matrix&#xff08;char[][]&#xff09;&#xff0c;里面的值不是1就是0&#xff0c;上、下、左、右相邻的1认为是一片岛。返回matrix中岛的数量。 本题共有2种解法&#xff0c;本篇先介绍最快的一种解法—递归。 分析&#xff1a; 递归的方…

Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server

根据日志&#xff0c;仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口&#xff0c;即使使用 root 权限。 请执行以下操作来进一步排查问题&#xff1a; 确保没有其他进程占用 8888 端口&#xff1a;使用以…

Linux进程(二)

文章目录 进程&#xff08;二&#xff09;Linux的进程状态R &#xff08;running&#xff09;运行态S &#xff08;sleeping&#xff09;阻塞状态D &#xff08;disk sleep&#xff09;深度睡眠T&#xff08;stopped&#xff09;状态X&#xff08;dead&#xff09;状态Z&#x…

小模型赋能大电网,手机拍照来建档

电能计量箱&#xff0c;一个听上去陌生&#xff0c;看到却一定觉得熟悉的东西。 作为电力系统中的关键组成部分&#xff0c;电能计量箱被广泛安装在各类生产生活区域&#xff0c;保护其内部的电能表、互感器等计量装置的安全&#xff0c;是保障电力系统稳定运行的重要设施。 随…