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



TCP对应于该传送层协议,和HTTP对应于应用层协议,从本质上讲,两者是没有可比性。Http该协议是基于TCP之上的,当浏览器须要从server获取网页数据的时候,会发出一次Http请求。

Http会通过TCP建立起一个到server的连接通道。当本次请求须要的数据完成后,Http会马上将TCP连接断开,这个过程是非常短的。所以Http连接是一种短连接。是一种无状态的连接。所谓的无状态,是指浏览器每次向server发起请求的时候。不是通过一个连接。而是每次都建立一个新的连接。

假设是一个连接的话,server进程中就能保持住这个连接而且在内存中记住一些信息状态。而每次请求结束后,连接就关闭。相关的内容就释放了,所以记不住不论什么状态。成为无状态连接。



随着时间的推移,html页面变得复杂了。里面可能嵌入了非常多图片,这时候每次訪问图片都须要建立一次tcp连接就显得低效了。

因此Keep-Alive被提出用来解决效率低的问题。从HTTP/1.1起。默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完毕后。client和server之间用于传输HTTP数据的TCP连接不会关闭,假设client再次訪问这个server上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接。它有一个保持时间。能够在不同的server软件(如Apache)中设定这个时间。

尽管这里使用TCP连接保持了一段时间。可是这个时间是有限范围的。到了时间点依旧是会关闭的。所以我们还把其看做是每次连接完毕后就会关闭。后来,通过Session,
Cookie等相关技术,也能保持一些用户的状态。可是还是每次都使用一个连接,依旧是无状态连接。



曾经有个概念非常容忍搞不清楚。

就是为什么Http是无状态的短连接。而TCP是有状态的长连接?Http不是建立在TCP的基础上吗,为什么还能是短连接?如今明确了。Http就是在每次请求完毕后就把TCP连接关了,所以是短连接。而我们直接通过Socket编程使用TCP协议的时候,由于我们自己能够通过代码区控制什么时候打开连接什么时候关闭连接。仅仅要我们不通过代码把连接关闭,这个连接就会在client和服务端的进程中一直存在,相关状态数据会一直保存着。

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

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

就像是你用已有的发动机,自己造了一辆卡车。去从server交互。

HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。

HTTP客户首先发起建立与serverTCP连接。

一旦建立连接。浏览器进程和server进程就能够通过各自的套接字来訪问TCP。如前所述,client套接字是客户进程和TCP连接之间的“门”。server端套接字是server进程和同一TCP连接之间的“门”。

客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,server从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或server一旦把某个消息送入各自的套接字。这个消息就全然落入TCP的控制之中。

TCP给HTTP提供一个可靠的传输数据服务;这意味着由客户发出的每一个HTTP请求消息终于将无损地到达server,由server发出的每一个HTTP响应消息终于也将无损地到达客户。



C#代码连接远程数据库用的是TCP协议。每次new 一个connection的时候,connection.open就打开了这个TCP连接。connection.Close的时候就关闭了这个连接。FTP的底层也是TCP, 只是是长连接的。

传输大文件比較快。

须要看详细场景。在server端。假设程序是採取的长连接的方式,那么就能控制同一时候连接到这个server的连接个数。防止同一时候有多个连接。

可是採取短连接的方式,那么就不能控制同一时候连接到这个server上的连接的个数。这也是一个长处。能够同一时候处理大量连接请求。可是假设连接请求量太大的话,可能造成server停止工作。

WebService不须要连接,一秒中至少能够支持上万/十万的请求,每次请求然后释放,没有空余的内存消耗。一般不会限制同一时候连接的个数,这是优势。

Message Queue须要建立连接, 支持上千的连接就非常吃力了。由于每一个连接即使没有在请求数据,也会在内存中占用一定的空间存储。会限制。比方SQL Server数据库server。一般最多同一时候连接16个。

Http协议一定通过指定的port。80,所以一般计算机上不会限制这个port,所以Http协议可以顺利通过全部机器上的防火墙。

而使用Socket编程的话,就须要自己指定特定的port。那么非常可能这个port是在某个环境中禁用的,那么就无法穿透防火墙。IIS使用的是80port,也就是这个程序一直在监听着这个port。一旦发现有人要建立到这个port的连接,他就会响应,然后建立连接。这里说的连接都是短连接。

所以你对server上的网址的请求,都是通直播80port节目现场。那么这port发送client浏览器。

版权声明:本文博主原创文章,博客,未经同意不得转载。

Http与协议TCP协议简单易懂的更多相关文章

  1. http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解

    1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...

  2. 数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点

    上一博客记录了UDP协议的关键要点,这部分记录TCP协议的关键要点. 24.3 传输控制协议(TRANSMISSION CONTROL PROTOCOL) TCP(Transmission Contr ...

  3. OSI七层协议&TCP协议(三次握手四次挥手)

    今日内容 python 基础回顾 软件开发架构 网络理论前戏 OSI 七层协议(五层) TCP协议 三次握手与四次挥手 UDP协议 内容详细 一.python 基础回顾 1.基本数据类型 整型 int ...

  4. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  5. TCP/IP协议--TCP协议概括和TCP连接的建立和终止

    TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...

  6. 第3章 TCP协议详解

    第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...

  7. java ->网络通信协议(UDP协议、TCP协议)

    网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规 ...

  8. 服务器编程入门(3)TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  9. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

随机推荐

  1. Redis启动多端口,运行多实例(转)

    使用redis在同一台机器上,启用多个端口,实现多个实例,完成集群的模拟实现. 启动多实例 redis默认启动端口为6379,我们可以使用 --port 来指定多个端口,如下,在linux终端命令: ...

  2. 第6本:《The Hunger Games》

    第6本:<The Hunger Games> 以前从未读过一本完整的英文小说,所有就在今年的读书目标中增加了一本英文小说,但在 头四个月内一直没有下定决定读哪一本.一次偶然从SUN的QQ空 ...

  3. 命令行參数选项处理:getopt()及getopt_long()函数使用

         在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc ...

  4. [cocos2dx-lua]&quot;Hello Lua&quot;分析

    一年之前学的cocos2dx,那时候还是用C++编写的.但学完之后就找的一个新的方向--Unity3D开发的岗位,对我而言是一个新方向,那时候经过了几个月的每天熬夜奋战,从"0"基 ...

  5. Hibernate常用Annotation标签说明

    @ javax.persistence.Entity 实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表 位置:用于类级别 参数:无 样例:@Entity 注意: ...

  6. 64地点 Windows 8/7 根据系统 32地点PLSQL 耦合 64 地点 Oracle 11g

    64地点 Windows 8/7 根据系统 32地点PL/SQL 耦合 64 地点 Oracle 11g     说明:安装后Oracle的 oci.dll 是64位的,而32位应用程序 PL/SQL ...

  7. REST Service 基础 A further step.

    1. REST Service虽然实现简单, 但也功能丰富, 可以用来实现各种基于Web的服务(service). 2. REST Service的一些特点: 1)平台无关 2) 语言无关 3)基于H ...

  8. Windows Phone开发(6):处理屏幕方向的改变

    原文:Windows Phone开发(6):处理屏幕方向的改变 俺们都知道,智能手机可以通过旋转手机来改变屏幕的显示方向,更多的时候,对于屏幕方向的改变,我们要做出相应的处理,例如,当手机屏幕方向从纵 ...

  9. MySQL在大数据Limit使用

    它已被用于Oracle一世.但今天,很惊讶,MySQL在对数量级的性能,甚至差距如此之大不同的顺序相同的功能. 看看表ibmng(id,title,info)  只要  id key 指数title ...

  10. 小猪的Android入门之路 Day 4 - part 1

    小猪的Android入门之路 Day 4 - part 1 Android事件处理机制之--基于监听的事件处理机制 本节引言: 在開始本个章节前,我们先回想下,如今我们已经知道了android的一些相 ...