Http协议与TCP协议简单理解

2023-05-16

https://blog.csdn.net/sundacheng1989/article/details/28239711

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解。


TCP协议对应于传输层,而HTTP协议对应于应用层 ,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。 所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次tcp连接就显得低效了。因此Keep-Alive被提出用来解决效率低的问题。从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。虽然这里使用TCP连接保持了一段时间,但是这个时间是有限范围的,到了时间点依然是会关闭的,所以我们还把其看做是每次连接完成后就会关闭。后来,通过Session, Cookie等相关技术,也能保持一些用户的状态。但是还是每次都使用一个连接,依然是无状态连接。

以前有个概念很容忍搞不清楚。就是 为什么Http是无状态的短连接,而TCP是有状态的长连接?Http不是建立在TCP的基础上吗,为什么还能是短连接? 现在明白了,Http就是在每次请求完成后就把TCP连接关了,所以是短连接。 而我们直接通过Socket编程使用TCP协议的时候,因为我们自己可以通过代码区控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着。

在C#中会有Socket,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。

比较形象的描述:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。对于从C#编程的角度来讲,为了方便,你可以直接选择已经制造好的轿车Http来与服务器交互。但是有时候往往因为环境因素或者其他的一些定制的请求,必须要使用TCP协议,这时就需要使用Socket编程,然后自己去处理获取的数据。就像是你用已有的发动机,自己造了一辆卡车,去从服务器交互。


HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的“门”。 客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务;这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。

C#代码连接远程数据库用的是TCP协议。每次new 一个connection的时候,connection.open就打开了这个TCP连接。connection.Close的时候就关闭了这个连接。FTP的底层也是TCP, 不过是长连接的。传输大文件比较快。 需要看具体场景。在服务器端,如果程序是采取的长连接的方式,那么就能控制同时连接到这个服务器的连接个数,防止同时有多个连接。但是采取短连接的方式,那么就不能控制同时连接到这个服务器上的连接的个数,这也是一个优点,可以同时处理大量连接请求。但是如果连接请求量太大的话,可能造成服务器停止工作。

WebService不需要连接,一秒中至少可以支持上万/十万的请求,每次请求然后释放,没有空余的内存消耗。一般不会限制同时连接的个数,这是优势。Message Queue需要建立连接, 支持上千的连接就很吃力了。因为每个连接即使没有在请求数据,也会在内存中占用一定的空间存储。会限制,比如SQL Server数据库服务器,一般最多同时连接16个。


Http协议一定通过指定的端口,80,所以一般计算机上不会限制这个端口,所以Http协议能够顺利通过所有机器上的防火墙。而使用Socket编程的话,就需要自己指定特定的端口,那么很可能这个端口是在某个环境中禁用的,那么就无法穿透防火墙。IIS使用的是80端口,也就是这个程序一直在监听着这个端口。一旦发现有人要建立到这个端口的连接,他就会响应,然后建立连接。这里说的连接都是短连接。所以你对服务器上的网址的请求,都是通过80端口送到网站程序的。然后通过这个端口发送的客户端浏览器。


2016-09-05更新:

最近读了读《TCP/IP协议卷》,又写了一篇后续文章,文章链接。

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

Http协议与TCP协议简单理解 的相关文章

  • Kalibr源码学习(一): 重投影误差

    Kalibr源码学习 一 重投影误差 给自己挖一个大坑 从标定结果来学习Kalibr的标定源码 这里基本以KB模型为例 也就是标定时 kalibr的模型设定为 model pinhole equi 这里以重投影误差开始 希望能坚持 重投影误
  • OpenCV入门: Mat数据类型及其转换,访问

    1 总结 先贴上我总结的Opencv的数据类型 主要是针对不同Mat类型进行新建 修改和访问时使用 更详细的数据访问见下文 2 CV 8UC3解说 新建一个CV 8UC3型的cv Mat 其中U代表了unsigned char型的数据 其表
  • Opencv单目标定flag的设定

    1 flag中的标签顺序 xff1a 在代码中的对应如下 xff1a enum CALIB USE INTRINSIC GUESS 61 1 lt lt 0 CALIB RECOMPUTE EXTRINSIC 61 1 lt lt 1 CA
  • 队列的基础知识及实现方法

    队列 在网上又看到关于队列的知识点 xff0c 有很多 xff0c 但都比较琐碎 xff0c 有的还有些错误 xff0c 为方便自己理解 xff0c 特整理出一篇 xff0c 顺便也加强记忆 xff1b 当然 xff0c 也附上我参考的博客
  • sudo:/usr/bin/sudo 必须属于用户 ID 0(的用户)并且设置 setuid 位

    应该是之前的误操作 导致sudo不能正常的使用 每次输入sudp 都会提醒 sudo xff1a usr bin sudo 必须属于用户 ID 0 的用户 并且设置 setuid 位 这是因为我之前修改了usr的权限 将usr整个文件夹的权
  • VS2015 调试代码时写入位置时发生访问冲突

    前一段时间写一个工程 xff0c 调用自己写的一个库 xff0c 编译成功 xff0c 执行时发生了访问冲突 xff1b 当时觉得很好奇 xff0c 这个库不是第一次调用 xff0c 之前调用过很多次都没有问题 xff0c 偏偏这次出现了访
  • GIT代码管理: git remote add

    这里主要以 如何将一份已经写好的代码提交到两个git远端 为例 xff0c 更好地理解git remote add这句 xff1b 首先要明白一句代码的意思 xff0c 以github最经常的提示为例 xff1a 在这张图面里git ini
  • 强化学习PPO算法的思路流程

    首先可以肯定的是PPO算法是基于actor critic框架的 xff0c 但是它又含有强烈的Policy Gradient的风格 本文仅介绍PPO算法的应用流程 通常PPO算法的实现中有三个network xff0c 一个critic n
  • ubuntu 查看usb设备

    原文地址 xff1a https zhidao baidu com question 1823163553720250108 html 感谢原作者分享 查看 USB 设备 使用的是哪个串口 ls l dev ttyUSB 查看 USB 设备
  • 惯导姿态角的解释和固定的变换公式

    psi tr jk 61 atan2 2 q 2 q 3 43 q 1 q 4 1 2 q 3 q 3 2 q 4 q 4 theta tr jk 61 asin 2 q 1 q 3 q 2 q 4 gamma tr jk 61 atan2
  • 这是我的C语言入门笔记。

    c语言入门 C语言一经出现就以其功能丰富 表达能力强 灵活方便 应用面广等特点迅速在全世界普及和推广 C语言不但执行效率高而且可移植性好 xff0c 可以用来开发应用软件 驱动 操作系统等 C语言也是其它众多高级语言的鼻祖语言 xff0c
  • matlab randn函数产生高斯随机噪声

    randn N 1 就是产生服从方差为1 xff0c 均值为0 xff08 即N 0 1 xff09 的Gaussian分布的NX1随机 噪音矩阵 xff0c 根据Gaussian概率密度函数的特性 xff0c 产生均值为5 xff0c 标
  • socket 发送结构体数据

    Socket中的send函数可以发送字符串 xff0c 但不能直接发送结构体 xff0c 因此在发送端先把结构体转成字符串 xff0c 然后用send发送 xff0c 在接收端recv字符串 xff0c 再转换成原先的结构体 xff0c 这
  • printf()函数详解

    感谢博主的分享 xff1a https me csdn net blog K346K346 1 printf 简介 printf 是C语言标准库函数 xff0c 用于将格式化后的字符串输出到标准输出 标准输出 xff0c 即标准输出文件 x
  • 导航系统中常用坐标系

    转自 xff1a 阿元老师UJN的博客 http blog sina com cn xywatersky 1 地心惯性坐标系 xff08 简称i系 xff09 OXiYiZi xff1a 原点在地球中心 xff0c 它不参与地球自转 xff
  • mavlink模块中接收offboard模式下的mavlink消息流

  • 本地SVN服务器的搭建(WINDOWS环境)

    1 下载安装 VISUALSVN SERVER 1 1下载地址 xff1a https www visualsvn com server download 1 2下载完成后 xff0c 双击安装 2 下载安装 TortoiseSVN 1 1
  • 微信第三方平台全网发布流程

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net weixin 35829542 art
  • 百度短地址 API接口 985.so 是一个免费且好用的短地址

    文档URL http help baidu com question prod en 61 webmaster amp class 61 CD F8 D2 B3 CB D1 CB F7 CC D8 C9 AB B9 A6 C4 DC amp
  • Python图形GUI工具包tkinter如何调整元件在窗口中的位置几何布局管理

    Tkinter中的GUI总是有一个root窗口 不管你是主动或者别动获得 主窗口就是你的程序开始运行的时候创建的 在主窗口中你通常是放置了你主要的部件 另外 Tkinter脚本可以依据需要创建很多独立的窗口 主要的方法就是通过创建Tople

随机推荐

  • Mysql数据库的使用总结之ERROR 1146 (42S02)

    在使用 mysql 数据库过程中 xff0c 遇到了错误 ERROR 1146 42S02 xff1a Table doesn t exist xff0c 经过了两天 xff0c 终于解决了这个问题 引起该错误的原因不同 xff0c 对应的
  • 电子专业必懂的焊接知识与技能!

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 焊接贴片元件需要的常用工具 让我们来了解一些常用的焊接贴片元件所需的一些基本工具 xff08 见图1 xff09 图1 手工焊接贴片元件所用到常用
  • HTTP消息中header头部信息的讲解

    HTTP Request的Header信息 1 HTTP请求方式 如下表 xff1a GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEA
  • HTTP 状态码

    HTTP状态码 当浏览者访问一个网页时 xff0c 浏览者的浏览器会向网页所在服务器发出请求 当浏览器接收并显示网页前 xff0c 此网页所在的服务器会返回一个包含HTTP状态码的信息头 xff08 server header xff09
  • HTTP请求的header头解析

    Request Headers xff1a 下图是我访问一个URL xff1a http www hzau edu cn 的一个 header 根据具体实例来分析一下各部分的功能及其作用 Accept 作用 xff1a 浏览器端可以接受的媒
  • http请求消息体和响应消息体

    http www cnblogs com mydomain archive 2012 11 05 2754487 html HTTP 基于请求与响应模式的 无状态的 应用层的协议 xff0c 常基于TCP 的连接方式 HTTP 允许传输任意
  • HTTP Header 详解

    HTTP Header 详解 HTTP xff08 HyperTextTransferProtocol xff09 即超文本传输协议 xff0c 目前网页传输的的通用协议 HTTP协议采用了请求 响应模 型 xff0c 浏览器或其他客户端发
  • PHP模拟http请求

    http flandycheng blog 51cto com 855176 251752 方法一 xff1a 利用php的socket编程来直接给接口发送数据来模拟post的操作 建立两个文件post php getpost php po
  • HTTP 消息结构

    HTTP是基于客户端 服务端 xff08 C S xff09 的架构模型 xff0c 通过一个可靠的链接来交换信息 xff0c 是一个无状态的请求 响应协议 一个HTTP 34 客户端 34 是一个应用程序 xff08 Web浏览器或其他任
  • php 构造http头 php模拟http请求 伪装头部信息

    http jingyan baidu com article 335530daafcd6019ca41c352 html lt php 构造 http 请求 filename 61 34 http sj mjerp com dabenyin
  • 使用驱动器中J:的光盘之前需要将其格式化。

    http tieba baidu com p 3203627680 不知道神马原因致使U盘无法打开 大家千万注意 xff1a 以后遇见这种情况千万别格式化 xff08 当然如果你的U盘或者硬盘里没有重要东西那就另当别论 xff09 xff0
  • 404、500、502等HTTP状态码介绍

    一些常见的状态码为 xff1a 200 服务器成功返回网页 404 请求的网页不存在 503 服务不可用 详细分解 xff1a 1xx xff08 临时响应 xff09 表示临时响应并需要请求者继续执行操作的状态代码 代码 说明 100 x
  • 2020年电赛题目,命题专家权威解析!

    关注 星标公众号 xff0c 直达精彩内容 来源 xff1a 德州仪器TI校园计划 大学生电子设计竞赛培训网上次发了关于电赛题目前三道题目解析的视频 xff1a 2020年电赛题目 xff0c 命题专家们怎么看 xff1f xff0c 这篇
  • php curl请求信息和返回信息设置代码实例

    在用curl抓取网页内容的时候 xff0c 经常要知道 xff0c 网页返回的请求头信息 xff0c 和请求的相关信息 xff0c 特别是在请求过程中存在重定向的时候获取请求返回头信息对分析请求内容很有帮助 下面就是一个请求中存在重定向的例
  • URL特殊字符转义

    问题描述 xff1a 在工作中 xff0c 因为需要将另外一个系统的一批产品转移到自己系统 xff0c 产品基础资料什么的 xff0c 都没问题 xff0c 直接给字段插入数据库就好 xff0c 但是遇到了图片的问题 xff0c 图片是在别
  • PHP中GET/POST方法参数传递空格+逗号等特殊字符处理办法

    自己在项目开发中写了个自用接口 xff0c 用GET方法传参 xff08 用户名和密码 xff09 最近收到用户反馈 xff1a 密码为特殊字符时会出错 我一开始想是不是php的mysql real escape string函数将特殊字符
  • canvas 背景透明

    theCanvas 61 document getElementById 39 canvasOne 39 var context 61 theCanvas getContext 39 2d 39 context fillStyle 61 3
  • Http压力测试工具HttpTest4Net

    HttpTest4Net是一款基于C 实现的和HTTP压力测试工具 通过工具可以简单地对HTTP服务进行一个压力测试 虽然VS NET也集成了压力测试项目 但由于VS自身占用的资源导致了在配置不高的PC上难以做到高并发压力测试 再加上需要装
  • PHP获取今天、昨天、明天的日期

    php view plain copy lt php echo 34 今天 34 date 34 Y m d 34 34 lt br gt 34 echo 34 昨天 34 date 34 Y m d 34 strtotime 34 1 d
  • Http协议与TCP协议简单理解

    https blog csdn net sundacheng1989 article details 28239711 在C 编写代码 xff0c 很多时候会遇到Http协议或者TCP协议 xff0c 这里做一个简单的理解 TCP协议对应于