HTTP长连接和短连接原理浅析

本文主要讲了,http长连接本质是tcp的长连接。

网络通信过程中,建立连接的本质是什么?

连接的本质

建立连接这个词,是从早期的电话系统中来的,那个时候,“建立连接”就真的是把你的电话和对方电话在电路上连起来。所以这个名词就保留至今。

当然现在的电话网络,早就不需要为某个通信建立专门的电路连接了,单个通信链路支持多路通信复用。

从TCP角度来说,“连接”是个纯粹概念性的东西。从开发角度来看,假设我们的服务器要给隔壁老王(192.168.233.233)进行联络,基本大概的步骤是:

……

……

……

这个建立连接的详细内容可以阅读《TCP/IP详解 卷一》。

从上面的描写可以看出来,所谓网络连接,并不存在物理上的动作。

PS:这里并没有完整描述整个连接建立过程,比如DNS,ARP部分,有需要再写吧。不过建议题主若想详细了解,还是翻翻《TCP/IP详解 卷一》更好,一个回答真的说不完。

原文请百度知乎,查看。

第二人阐述:

网络通信建立连接的本质:告知彼此的第一个发送字节的初始序列号,建立连接后对每一个发送的字节,都需要

以初始序列号为原点,进行编号,需要对方来确认,每一个字节编号都已经成功接收,此乃建立连接的本质。

以大家都耳熟能详的TCP来举例,但是先强调一点,TCP 有两个状态位比较特殊,

一个是SYN,
一个是FIN,
他们各占一个字节。
A(初始序列号为0)
--------TCP 连接--------
(初始序列号为0)B

双方初始序列号是由OS动态生成的,随机的值,
一般每个TCP session都会有不一样的初始序列号,占四个字节,为了便于描述,
假定通信双方的初始序列号都为0,A先发1000字节的数据给B,发送成功之后释放连接。

Step 1: A 发送TCP SYN 给B

Step 2: B 发送TCP SYN + ACK给A

Step 3: A发送ACK给B

完成建立连接,由于SYN占用一个字节,而ACK不占用字节,其实三次握手的本质是对SYN这个编号为0,占用一个字节的数据的双向确认,
此过程完成,彼此的真正数据的交换的编号为1,1。

Step 4: A 发送1000字节给B,第一个字节的编号为1,最后一个字节编号为1000

Step 5: B发送一个包含ACK的确认号1001,意思是1001这个编号前的数据已经成功接收,如果还有数据要发送,请使用编号1001。
A主动发起释放连接

Step 6: A发送包含FIN的单向释放连接,编号1001

Step 7: B确认此释放连接请求,ACK 1002
B发起单向释放连接

Step 8: B发送包含FIN的单向释放连接,编号1

Step 9: A确认此释放连接请求,ACK 2,意思是FIN已经成功接收,连接可以释放。

另外,TCP建立连接还会有MSS,Window Size,Scaling window ,SACK,SNACK,Security Authentication option等参数的协商,
但是这些参数只是为了提高传输效率、增加TCP连接的安全性,避免没有安全保护的TCP遭到第三方的伪造TCP Reset 攻击。

第三人阐述:

连接的本质就是通信各方用一种共同认可的机制进行数据传输。

分层结构的出现就是为了大家协商出共同认可的机制,提供指导思想。TCP/IP就是这种指导思想的一种实现。

本文内容摘抄自知乎。

最新文章

  1. css3属性-webkit-font-smoothing
  2. BZOJ 1246 & 有点不一样的概率DP
  3. eclipse maven spring mvc el表达式无效
  4. js队列
  5. Java开发中经典的小实例-(用*打印图案)
  6. ZeroMQ 在 centos 6.5_x86_64 下的安装
  7. java实现url转码、解码
  8. AngularJS进阶(十七)在AngularJS应用中实现微信认证授权遇到的坑
  9. linux日志logger命令详解
  10. hive metastore && hiveserver2 . 基本配置
  11. UBUNTU18.4环境下使用更好用的搜索引擎(无奈,只能起这样的标题)
  12. route
  13. oracle 查看表空间使用情况
  14. 微信小程序入门篇
  15. C语言专题-基本数据类和占位符
  16. struts2从浅至深(四)下载文件
  17. Python2.7在Windows下CMD编码为65001/utf-8时print报错[Errno 0]/[Errno 2]
  18. Linux telnet命令详解
  19. linux自动获得mac地址,修改网络配置
  20. 获取指定包名下继承或者实现某接口的所有类(扫描文件目录和所有jar)

热门文章

  1. 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)
  2. NEC 框架规范 css reset
  3. 技巧:Vimdiff 使用
  4. BZOJ2844: albus就是要第一个出场(线性基)
  5. ABAP术语-Error Message
  6. 设置Vim编辑器里Tab的长度,行号
  7. Linux系统运维基础测试题
  8. jQuery 切换图片(图标)效果
  9. Sencha Themer
  10. json格式转化