[转帖]tcp、http和socket的区别
https://www.jianshu.com/p/88d69454bdde
一:tcp协议
tcp协议属于传输层协议(UDP也属于传输层协议,但是UDP协议是无状态的)。建立一个TCP连接需要三次握手,断开一个TCP连接需要四次挥手。手机能够使用联网功能,是因为手机底层实现了TCP/IP协议,使用手机终端通过无线网就可以与服务端建立一个tcp连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
tcp建立连接需要三次握手:
如图所示:客户端要与服务端建立tcp连接,首先向服务端发送一个syn J信号,服务端收到此信号后向客户端回答一个ACK J+1信号,并额外加了一个syn K信号,客户端收到ACK J+1信号后就知道,服务端能收到我的信号,后面我客户端就可以放心的发送数据给你服务端而不用担心你服务端接收不到我发送的数据了。客户端收到服务端发送的SYN K信号后,还需要向服务端回一个 ACK K+1信号,这样服务端收到此信号就知道,我服务端给你客户端发送的信号,你客户端能够收到,这样我服务端就可以放心的给你客户端发送数据而不用担心你客户端收不到自己发送的数据了。其实从上面的描述可以看到:建立连接完全可以跟断开TCP连接一样分四步走,只不过是把服务端的应答信号ACK和客户端的认证请求信号SYNC这两步做成一步走了。
tcp连接关闭时需要四次挥手:
客户端收到服务端的应答信号ACK M+1后,客户端就知道:服务端知道我客户端不会再发送数据包给你服务端了,你可以停止对我的监听了。但是此时只是客户端->服务端的单向流动停止了,另一个方向的流动:服务端->客户端的数据发送还可以正常进行,直到服务端向客户端发送FIN N挥手信号,客户端向服务端回应ACK N+1信号,服务端才知道:客户端知道我服务端不会再发送数据包给你客户端了,你可以停止对我的监听了。至此,客户端->服务端的单向流动和服务端->客户端的单向流动两个方向都停止,可以关闭连接了。
二:http协议
http协议,简称超文本传输协议(Hypertext Transfer Protocol),是web应用程序的基础,也是手机联网常用的协议之一。http协议在tcp协议上面,属于应用层协议。
http协议最显著的特点就是:客户端发送的每次请求,都需要服务端返回响应。客户端收到服务端的响应后,主动关闭连接。一次TCP连接过程完成。
1)在HTTP1.0中,客户端每发送一次请求都需要新建一个单独的连接,得到服务端响应后,主动断开本次连接。
1)在HTTP1.1中,可以在一次连接中处理多次请求(keep Alive,默认开启),尽管有 Keep-Alive 机制可以复用,但在每个连接上同时只能有一个请求 / 响应,这意味着完成响应之前,这个连接不能用于其他请求。比如某个tcp连接的keep Alive的参数设置为:max=5,time_out=10s(本次连接最长存活时间为10s,最多请求次数为5次),则请求情况像下面这样:
而不是像这样:
从图3中可以看到,如果浏览器需要向同一个域名发送多个请求,需要在本地维护一个 FIFO 队列,完成一个再发送下一个。这样,从服务端完成请求开始回传,到收到下一个请求之间的这段时间,服务端处于空闲状态。
后来,人们提出了 HTTP 管道(HTTP Pipelining)的概念,试图把本地的 FIFO 队列挪到服务端。它的原理是这样的:浏览器一股脑把请求都发给服务端,然后等着就可以了。这样服务端就可以在处理完一个请求后,马上处理下一个,不会有空闲了。甚至服务端还可以利用多线程并行处理多个请求。但是由于一些原因,http1的管道技术使用得并不完美和普及。
http连接下,客户端保持在线状态的方法:客户端每次建立http连接,得到服务端响应后,都会主动断开连接,所以说http连接是短连接。那怎么保持客户端的在线状态呢?答案就是:客户端需要不断的向服务端发送连接请求。通常的做法是,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
为什么说http连接是无状态的?
【无状态】能在其他资料中查到的说法有:
(1)协议对于事务处理没有记忆能力,(2)对同一个url请求没有上下文关系,(3)每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况,(4)服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器,(5)人生若只如初见,可以参考:http协议无状态中的 状态 到底指的是什么?!,文中经过分析理清了很多概念,以及之间的关系,推测出【状态】的含义就是:客户端和服务器在某次会话中产生的数据,从而【无状态】就意味着,这些数据不会被保留。
三:socket
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
tcp服务端和tcp客户端使用socket通信的过程如下。从图中可以看到,socket连接可以保持长连接。
注意的是,socket连接可以由客户端主动关闭,也可以由服务端主动关闭。
关于在http之后为什么又出现了socket,请看我的另一片文章:C10k问题
参考借鉴:
《Unix网络编程 卷I 套接字联网API》
http://www.cnblogs.com/jiangshiyong/archive/2012/08/26/2657811.html
https://imququ.com/post/http2-and-wpo-2.html
http://blog.csdn.net/jenminzhang/article/details/47017741
[转帖]tcp、http和socket的区别的更多相关文章
- TCP/IP,HTTP,Socket的区别与联系
一 忆往昔,尽是悔恨泪. 在学校的时候学过,网络七层,也知道tcp的三次握手.但因为根本没用在实际开发中,所以逐渐淡忘.现在就再次理解下三个的区别与联系. 二 正题 网络七层: ...
- HTTP/TCP/IP UDP Socket等区别联系
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- 【转】TCP/IP和SOCKET的区别
要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...
- Http、TCP/IP、Socket的区别
网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...
- TCP/IP,Http,Socket的区别
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...
- ios开发网络知识 TCP,IP,HTTP,SOCKET区别和联系
TCP,IP,HTTP,SOCKET区别和联系 网络由下往上分为: 对应 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- ...
- Http、tcp、Socket连接区别
转自Http.tcp.Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Sock ...
- TCP/IP、Http、Socket的区别与关系
--TCP/IP.Http.Socket的区别与关系 --------------------------------------2014/05/14 网络由下往上分为 物理层.数据链路层.网络层.传 ...
- TCP socket和web socket的区别
小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧.如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视. 还是让我们阅读一些英文材料吧. 让我们直接看sta ...
- TCP/IP、SOCKET、HTTP之间的联系与区别
主要内容: 1.网络的七层协议 2.TCP/IP.SOCKET.HTTP简介 3.TCP连接.HTTP连接.Socket连接的区别 一.网络的七层协议 网络七层由下往上分别为物理层.数据链路层.网络层 ...
随机推荐
- 虚拟化M搭建及基本操作
虚拟化MH搭建 虚拟化概念: 虚拟机安装分为2块:RHEVM .RHEVH RHEVM:负责管理角色 RHEVH:负责运算角色 2016-09-23_0-52-54.png hypervisor: 提 ...
- C++ 惯用法之 RAII
RAII(Resource Acquisition Is Initialization)资源获取即初始化,是 C++ 中最基本.应用最广范的惯用法(idiom)之一. RAII 的基本思想是通过构造/ ...
- 神经网络入门篇:激活函数的导数(Derivatives of activation functions)
激活函数的导数 在神经网络中使用反向传播的时候,真的需要计算激活函数的斜率或者导数.针对以下四种激活,求其导数如下: 1)sigmoid activation function 图1.8.1 其具体的 ...
- 神经网络基础篇:详解导数(Derivatives)
导数 一个函数\(f(a)=3a\),它是一条直线.下面来简单理解下导数.让 看看函数中几个点,假定\(a=2\),那么\(f(a)\)是\(a\)的3倍等于6,也就是说如果\(a=2\),那么函数\ ...
- 云原生开发者须具备的1+N技能,开启第二曲线
摘要:云的大环境下,意味以云为中心的快速应用开发能力将成为"胜负手".在现如今如此复杂的外部环境,且高速发展的情况下,为了不重蹈覆辙,必须需要开发者的第二曲线来破局! 随着云计算的 ...
- GaussDB(for Redis)双活容灾支持4大应用场景,为业务安全保驾护航
摘要:GaussDB(for Redis)的双活解决方案,支持同域主备.同域双主.异地主备.异地双主四大应用场景,提供了安全可靠的容灾能力. 一场火灾引发的思考 2021年3月10日,欧洲某云服务提供 ...
- Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
Unity3D 导出的apk进行混淆加固.保护与优化原理(防止反编译) 目录 前言: 准备资料: 正文: 1:打包一个带有签名的apk 2:对包进行反编译 3:使用ipaguard来对程序进行加固 ...
- 总结vue3 的一些知识点:MySQL 排序
MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段 ...
- 火山引擎DataLeap:助你实现从数据研发1.0到数据研发3.0的跨越
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎开发者社区 Meetup 第 12 期暨超话数据专场在深圳举办,本次活动主题为"数智化转型 ...
- 浅谈splice( )与slice( )
1.splice( ) 概念:splice( )用于修改原始数组,它可以删除.插入.替换数组的元素,并返回被删除的元素组成的新数组. 语法:splice(start,deleteCount,item1 ...