https://www.jianshu.com/p/88d69454bdde

一:tcp协议

tcp协议属于传输层协议(UDP也属于传输层协议,但是UDP协议是无状态的)。建立一个TCP连接需要三次握手,断开一个TCP连接需要四次挥手。手机能够使用联网功能,是因为手机底层实现了TCP/IP协议,使用手机终端通过无线网就可以与服务端建立一个tcp连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

tcp建立连接需要三次握手:

 
图1:tcp连接三次握手示意图

如图所示:客户端要与服务端建立tcp连接,首先向服务端发送一个syn J信号,服务端收到此信号后向客户端回答一个ACK J+1信号,并额外加了一个syn K信号,客户端收到ACK J+1信号后就知道,服务端能收到我的信号,后面我客户端就可以放心的发送数据给你服务端而不用担心你服务端接收不到我发送的数据了。客户端收到服务端发送的SYN K信号后,还需要向服务端回一个 ACK K+1信号,这样服务端收到此信号就知道,我服务端给你客户端发送的信号,你客户端能够收到,这样我服务端就可以放心的给你客户端发送数据而不用担心你客户端收不到自己发送的数据了。其实从上面的描述可以看到:建立连接完全可以跟断开TCP连接一样分四步走,只不过是把服务端的应答信号ACK和客户端的认证请求信号SYNC这两步做成一步走了。

tcp连接关闭时需要四次挥手:

 
图2: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:http1.1一次keep alive连接示意图

而不是像这样:

 
图4:http1.1一次keep alive连接错误示意图

从图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层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

 
图5:socket通信系统模块示意图

tcp服务端和tcp客户端使用socket通信的过程如下。从图中可以看到,socket连接可以保持长连接。

 
图6:基本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的区别的更多相关文章

  1. TCP/IP,HTTP,Socket的区别与联系

    一 忆往昔,尽是悔恨泪.       在学校的时候学过,网络七层,也知道tcp的三次握手.但因为根本没用在实际开发中,所以逐渐淡忘.现在就再次理解下三个的区别与联系. 二 正题       网络七层: ...

  2. HTTP/TCP/IP UDP Socket等区别联系

    1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...

  3. 【转】TCP/IP和SOCKET的区别

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  4. Http、TCP/IP、Socket的区别

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...

  5. TCP/IP,Http,Socket的区别

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...

  6. ios开发网络知识 TCP,IP,HTTP,SOCKET区别和联系

    TCP,IP,HTTP,SOCKET区别和联系 网络由下往上分为:        对应 物理层-- 数据链路层-- 网络层--                       IP协议 传输层--     ...

  7. Http、tcp、Socket连接区别

    转自Http.tcp.Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 1.TCP连接 要想明白Sock ...

  8. TCP/IP、Http、Socket的区别与关系

    --TCP/IP.Http.Socket的区别与关系 --------------------------------------2014/05/14 网络由下往上分为 物理层.数据链路层.网络层.传 ...

  9. TCP socket和web socket的区别

    小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧.如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视. 还是让我们阅读一些英文材料吧. 让我们直接看sta ...

  10. TCP/IP、SOCKET、HTTP之间的联系与区别

    主要内容: 1.网络的七层协议 2.TCP/IP.SOCKET.HTTP简介 3.TCP连接.HTTP连接.Socket连接的区别 一.网络的七层协议 网络七层由下往上分别为物理层.数据链路层.网络层 ...

随机推荐

  1. libGDX游戏开发之NPC敌人事件(六)

    libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和google找资料,相互学习的可以加我联系方式. ...

  2. vue 遍历的汉字显示不同的颜色

    <template> <div> <div class="stars"> <span v-for="(star, index) ...

  3. 技术实践丨PostgreSQL插件之pg_dirtyread "闪回查询"

    摘要:Oracle数据库有时候不小心删除掉数据,想查询这些数据,或者恢复数据,就可以使用带有as of子句的select语句进行闪回查询. PG粉有福了,下面介绍一种类似"闪回查询" ...

  4. 如何正确使用Python临时文件

    摘要:临时文件通常用来保存无法保存在内存中的数据,或者传递给必须从文件读取的外部程序.一般我们会在/tmp目录下生成唯一的文件名,但是安全的创建临时文件并不是那么简单,需要遵守许多规则. 1.前言 临 ...

  5. 【火热招募】一文看懂华为云IoT Edge边缘计算开发者大赛技术亮点

    摘要:第二届边缘计算开发者大赛已启动,赛程时间将从9月持续到12月,华为云IoT Edge · 边云协同赛道奖金池高达40万元. 近日,第二届边缘计算开发者大赛已启动(查看启动仪式),全球揭榜挂帅火热 ...

  6. 十大 CI/CD 安全风险(一)

    CI/CD 环境.流程和系统是现代软件组织的核心.他们将代码从开发工程师的工作站传递到生产环境.结合 DevOps 和微服务架构的兴起,CI/CD 系统和流程重塑了工程生态系统: 技术堆栈更加多样化, ...

  7. Mac 向日葵设置

  8. lab3 page tables

    1.Speed up system calls (easy) 要求:有些操作系统(例如 Linux)通过在用户空间和内核之间的只读区域共享数据来加速某些系统调用.这样可以消除在执行这些系统调用时进行内 ...

  9. MIGO生产订单入库写入批次特性增强

    一.生产订单入库 MIGO根据生产订单入库时,将生产订单中的字段,写入到批次特性中 二.BADI:MB_MIGO_BADI 调用BADI中的IF_EX_MB_MIGO_BADI~POST_DOCUME ...

  10. #2102:A计划(DFS和BFS剪枝搜索)

    题意: 有几个比较坑的地方总结一下, 很容易误解: 遇到#就必须走 #不消耗时间 #对面如果也是#也不能走, 要不然无限循环了 最短路径剪枝时, 发现不能走的#是要把两步都标注为-1并跳出 题解: 一 ...