TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来讲,两者没有可比性。Http协议是创建在TCP协议基础之上的,当浏览器须要从服务器获取网页数据的时候,会发出一次Http请求。Http会经过TCP创建起一个到服务器的链接通道,当本次请求须要的数据完毕后,Http会当即将TCP链接断开,这个过程是很短的。因此Http链接是一种短链接,是一种无状态的链接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是经过一个固定的链接,而是每次都创建一个新的链接。若是是一个固定链接的话,服务器进程中就能保持住这个链接而且在内存中记住一些信息状态。而每次请求结束后,链接就关闭,相关的内容就释放了,因此记不住任何状态,成为无状态链接。html
随着时间的推移,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个。markdown
Http协议必定经过指定的端口,80,因此通常计算机上不会限制这个端口,因此Http协议可以顺利经过全部机器上的防火墙。而使用Socket编程的话,就须要本身指定特定的端口,那么极可能这个端口是在某个环境中禁用的,那么就没法穿透防火墙。IIS使用的是80端口,也就是这个程序一直在监听着这个端口。一旦发现有人要创建到这个端口的链接,他就会响应,而后创建链接。这里说的链接都是短链接。因此你对服务器上的网址的请求,都是经过80端口送到网站程序的。而后经过这个端口发送的客户端浏览器。网络