tcp 和 http 理解学习

本贴最后更新于 2611 天前,其中的信息可能已经斗转星移

在 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 端口送到网站程序的。然后通过这个端口发送的客户端浏览器。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 295 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 16 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • Visio
    1 引用 • 2 回帖 • 4 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 742 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 3 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 32 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 438 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖 • 3 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 786 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 131 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖 • 1 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖 • 1 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 667 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 2 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖 • 1 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 701 关注
  • OnlyOffice
    4 引用 • 20 关注