标题: TCP与HTTP的区别与联系
作者: 老虎会游泳 @Ta
时间: 2012-07-14
我将尽量使用形象化的语言描述。
我们的互联网的“道路”,是由一条条电缆,一个个路由器,各种网卡,以及其他各种设备和必要的设备控制软件构成的。它们共同组成互联网的底层部分,从下往上分别是物理层、数据链路层、网络层。我们不必知道这条“道路”的实现细节,只要知道这条道路已经建成,可以使用了。
而TCP(Transmission Control Protocol 传输控制协议)则是一家物流公司,它和其他物流公司(如UDP)一样位于传输层----位于网络层之上。“位于网络层之上”的意思就是说,这些物流公司的“车”(数据包)都要跑在“互联网”这条已经建成的道路上。
物流公司是干什么的呢?它们就是把货物打包起来,装在一起,并从一个地方运送到另一个地方而已。TCP也在干着同样的事,它把从一台电脑收到的许许多多数据分别打包起来(TCP数据包),一份一份运送到其他电脑,到达目的地之后,TCP解开数据包,把数据按顺序合并,然后派送货物----把不同来源的数据分别交给不同的应用程序(如果收货人不存在,就回送一个失败通知给发货人,然后数据被直接丢弃了)----至于数据本身是什么,有什么意义,TCP是不关心的。TCP所关心的是,自己是不是把货物成功的送到了目的地,在运输过程中是否发生了损坏等等。
由于TCP运送的货物具有神奇的特性----它们可以被无限复制。所以当收货方TCP发现数据传输过程中丢失了(丢包),或损坏了,它就可以简单的要求发货方TCP重新发一份相同的数据包过来。所以TCP是“安全的传输层协议”,使用TCP传输虽然有些慢(因为需要确认每一个数据包是否损坏),但数据一般不会发生损坏(只是一般)。
而另一家物流公司UDP提供的服务则有不同的特性:速度很快,但是不保证数据到达时是完整的,需要发货人和收货人自己验证数据完整性,自己完成丢包重发的操作。UDP虽然因为“要自己实现数据完整性验证机制”而有些麻烦,但是速度很快,所以很多P2P下载软件都使用它。
作为一个物流公司,TCP运输着各种各样的货物(数据)。这些数据往往有着各自不同的标准。
比如,人们制定了一个通过TCP(或其他类似的“物流公司”)传输网页和多媒体内容的规范(协议),它被称为HTTP(HyperText Transfer Protocol 超文本传输协议)。
这就是HTTP与TCP的关系。HTTP需要TCP建立起的连接(通道)来传输数据。所以当我们说自己正在使用HTTP时,我们也一定在使用TCP,只不过TCP是用来传输HTTP的。
同样,我们常见的FTP也是工作在TCP上的,它也使用TCP作为传输通道。
既然我们使用HTTP的同时肯定在使用TCP,那么JAVA的“HTTP连接”和“TCP连接”又是怎么回事呢?
其实这和HTTP通讯的不同实现方式有关。
WEB服务器只接受HTTP协议,所以不管怎样,要打开一个网页,就必须使用HTTP协议。JAVA提供了一个封装好的HTTP类,里面有一些方便的用于HTTP通信(打开网页、下载文件等)的方法,我们可以使用这个类来实现打开网页。这时,JAVA授权提示是“建立HTTP连接”。
但是,JAVA同时也提供TCP连接类。而我们知道HTTP是工作在TCP之上的。所以我们完全可以抛掉JAVA封装的那个HTTP类,用TCP连接自己重新实现一个HTTP操作类。自定义的类有很强的灵活性,可以实现许多更丰富的功能----因为我们可以直接操作HTTP协议本身。能操作HTTP协议本身,也就意味着对其添加代理服务器也相当容易,只要查找替换一下就成功了。
而通过这种方式建立的连接,JAVA会提示“建立TCP连接”。不过事实上,通过TCP传输的还是HTTP数据。
因为TCP连接类的存在,所以JAVA可以实现大部分工作在TCP协议上的客户端,比如FTP,Telnet,SSL,SSH等等,只是它们的复杂程度不同而已。甚至自定义协议也可以。比如JAVA QQ使用的就是它私有的自定义协议。
[隐藏样式|查看源码]