前端浅谈---协议相关(TCP连接)
TCP连接
http的描述里面,我弱化了交互过程的描述,因为它相对复杂.所以我在此单独描述.客户端和服务端传递数据时过程相对谨慎和复杂,主要是开始和结束的过程.而这整个过程就是TCP连接.连接流程大体包括:
三次握手
握手是见面时建立信任的过程.其主要目的是确认彼此的身份和明确是确认有需求而不是来找茬的.所以这里需要几个关键词:
请求/响应方的身份证:seq(客户端/服务器的标记序号)
标志位:SYN/FIN/ACK等等
确认信息内容:ack(seq+ACK)
这里要强调一下标志位,它相当于行业黑化,有几个固定的值,双方看到其中一个基本就知道干嘛的了.我们主要说其中正常TCP过程会有的
SYN:新建一个连接请求
ACK:确认序号有效
FIN:释放一个连接
1.握手过程
因为互联网上,一个客户端可能同时对接多个服务器.服务器也是同样.所以,可以理解在互相接通之前大家都是看不见对方在网上聊天室里喊话.
第一次握手:我,shyno,(老爸)打钱. (因为有ip定位,客户端是能直接向指定服务器发送请求的.并不是谁听到谁回复.并且会带上自己的seq序号,同时发送SYN=1,
告诉服务端我希望建立一个连接请求). 客户端------SYN=1,seq=x------>服务端
第二次握手:你是shyno啊?我听到了.我是ShyNo,你爸,你是希望我给你打钱是吧?(确认序列号是否有效,即ACK=1,然后申明自己是你希望找的人,自己的seq,接着跟你确认
你之前的信息,ack=seq(shyno)+ACK(确认)) 服务端----->SYN=1,seq=y,ack=x+1---->客户端
第三次握手:哦,ShyNo确实是我爸.你收到我的请求了吧?那我现在希望ShyNo,赶紧给shyno打钱(收到服务端的请求之后要确认服务器确实收到了我的要求,然后才明确本客
户端(,带序号,而且已确认),向目标客户端(带序号,已确认)发送连接请求.) . 客户端----->seq=x+1,ack=y+1------>服务端
总结一下,TCP握手过程分三次.然后前两次是确认双方身份以及确认大家还是在同一个需求上进行交流,最后一次才是真正的发送连接请求. 第一次,SYN=1,加上客户端seq,让服务端确认.第二次,SYN=1,服务端的seq,再加上服务端的确认结果.最后一次是已确认过的双方身份,正式发请求.而确认结果是通过ACK来表示的,seq后面加上ACK=1.
2.为什么要三次握手?
最主要的目的是"试触".假如我直接让服务器给我连接,很有可能就像我上来就让老爸打钱.他不知道我的号是不是被盗了,我也不知道你现在是不是在看手机.其结果就是我得一直等着他.什么事都干不了.所以我得先让他知道我没被盗号,并且我希望和他说个事(第一次握手目的).然后,如果老爸看到了信号,会回复我,一方面是确认我是不是被盗号了,另一方告诉我,现在是我老爸在回复我,而不是老妈在用他手机回复我,另一方面是想知道过去了这几分钟了,你是不是还想要打钱(第二次握手目的).我告诉他,是的,我还想要钱.这条消息不是群发的,你可以准备给我打钱了(第三次握手的目的)
因为在客户端等待的期间,有可能超过了它设定的时间,那它会断开连接,重新发起一个新的请求.比如我等了几分钟发现老爸不回我了,我觉得还是算了.于是我又说,那我给你转点钱吧(断开旧请求,打开新请求了).可对于服务端,他可能这时候收到前一个请求.直接给我转钱了.跟我想要的目的不一样,我明明不要钱了,他还给我.造成这种情况的主要原因,一方面是请求的时候信息可能会丢失,另一方面信息传递和响应过程都有延迟.一步步确认以保证准确性
数据交换
握手结束后正式互相传递数据.
四次挥手
这里有三个流程是跟握手是一样的.也就是说请求新建连接的过程和要求断开连接的过程是查不多的.他们唯一的区别是,客户端找服务器的时候直接上来就行.但是断开连接的时候是需要对方准备好的.为啥,因为断开之前客户端一直在给你传输数据,万一你直接断开,他还没转完咋办?
1.挥手过程
第一次挥手:我,shyno,要挂了. 客户端-----FIN=1,seq=o---->服务器
第二次挥手:你老爸我知道了,你shyno想挂了是吧? 服务器-----eq=p,ack=o+1---->客户端
且慢,我问问你老妈还有没有啥跟你说的.
第三次挥手:我,你老妈,没啥好跟你说的了,我们全家都没啥说的了,你挂吧(ACK=1,这个跟之前提到的ACK不一样,之前的ACK是表明确认身份,而这里是表示服务器是否可断开
的状态的) 服务器-----FIN=1,seq=q,ack=o+1,ACK=1----->客户端(多出的一步)
第四次挥手,:那,我,shyno,要挂断了,老妈.(挂断) 客户端-----seq=o,ack=q+1-------->服务器
然后就可以各自做各自的事情去了.
2.什么时候加标志位
最后再理解一下标志位啥时候加啥时候不加,一般,最后一次客户端向服务端发请求的时候不加.为啥?因为在之前的"试触"或者说认证的过程中就已经明白你这次请求的性质是啥了,最后一次你直接说事就行.另外,"性质不纯"的不加.比如第二次挥手,目的并不是告诉你可以断开了,而是告诉你要等等.所以,就算要加,也应该加一个标志等等的标志位,目前没有.所以,不加FIN.
3.是不是每次都需要三次握手和四次挥手?
首先,一个http连接必定会经过三次握手和四次挥手.但是http连接分为可持续性连接和非持续性连接.如果是持续性连接,只要保持连接,就不需要每次都三次握手和四次挥手.请求报文里可进行设置,告诉服务器需不需要保持连接.Connection:Keep-Alive或者Connection:close.
前端浅谈---协议相关(TCP连接)的更多相关文章
- 前端浅谈-协议相关(http/https)
当DNS工作完之后得到了一个网址 https//192.168.1.255/index.html 这个并不符合标准的请求路径.接下来就是https的功能了.讲https前先讲讲它的前身http协议 H ...
- 前端浅谈-协议相关(DNS协议)
从应用层到实体层的协议太多了,我们并不能一一涉及,目前来说就打算整理可能会与前端相关的协议. 前端面试常会问到一个问题-"从输入一个url到页面渲染经历了哪些过程".这其实是一个相 ...
- FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接
一.为什么写这个 昨天遇到个ftp相关的问题,关于ftp匿名访问的.花费了大量的脑细胞后,终于搞定了服务端的配置,现在客户端可以像下图一样,直接在浏览器输入url,即可直接访问. 期间不会弹出输入用户 ...
- OSI七层协议与TCP连接
概述 为了追求效率,我们写代码,不可能去关注底层知识,但往往到出了问题,或者性能调优.我们就会速手无策,仔细为自己查缺补漏,总结知识点. 网络协议 互联网的本质就是一系列的网络协议,让不同计算机能够互 ...
- 浅谈HTTP和TCP的理解
TCP协议对应于传输层,而Http协议对应于应用层,Http协议是建立在TCP协议之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.HTTP会通过TCP建立一个连接通道,当HTT ...
- 【网络协议】TCP连接的建立和释放
转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...
- 浅谈Http、TCP、UDP和 IP 的的区别
应用层:Http,超文本传输协议(HyperText Transfer Protocal):利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发起HTTP请求 ...
- 智能车学习(二十)——浅谈C车硬连接与软连接
一.为何要追求软连接? 车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...
- 浅谈协议(四)——wireshark强力解析视频流协议
参考链接: https://wenku.baidu.com/view/460f016e49d7c1c708a1284ac850ad02de800722.html https://wenku.baidu ...
随机推荐
- [luogu6466]分散层叠算法
做法1 对于每一个询问,直接暴力在每一个序列中二分查询 时间复杂度为$o(nk)-o(k\log n)$ 做法2 将所有序列合并后排序,并对每一个元素预处理出每个序列中第一个大于等于其的元素(位置), ...
- [luogu7417]Minimizing Edges P
令$e_{G}(a)$和$o_{G}(a)$分别表示在图$G$中从1到$a$的长度为奇数/偶数的最短路(若该类最短路不存在则为$\infty$),不难得到有以下结论--$f_{G}(a,b)=\beg ...
- [atARC096F]Sweet Alchemy
给定一棵有根树,记$f_{i}$表示$i$的父亲,每一个点有一个代价$c_{i}$ 给定常数$D$和$X$,再给每个点赋一个权值$v_{i}$($v_{i}\ge 0$),满足以下条件下最大化$\su ...
- 基于Docker搭建Maven私服Nexus,Nexus详解
备注:首先在linux环境安装Java环境和Docker,私服需要的服务器性能和硬盘存储要高一点,内存不足可能到时启动失败,这里以4核8GLinux服务器做演示 一:基于Docker安装nexus3 ...
- vue使用axios读取本地json文件来显示echarts折线图
编辑器:HBuilderx axios文档:http://www.axios-js.com/zh-cn/docs/ echarts实例:https://echarts.apache.org/examp ...
- [yLOI2018] 锦鲤抄
先思考图上是\(tag\)的特殊情况. 考虑我们按拓扑序反过来操作,就可以得到我们任意想要的顺序. 那么我们把所有的图都缩点操作,那么我们只需要考虑一个联通分量里就行了. 一个联通分量最后只会剩下一个 ...
- 【GS模型】使用R包sommer进行基因组选择的GBLUP和RRBLUP分析?
目录 简介 GS示例代码 简介 R包sommer内置了C++,运算速度还是比较快的,功能也很丰富,可求解各种复杂模型.语法相比于lme4包也要好懂一些. 建议查看文档:vignette("v ...
- 【R】爬虫案例
爬取豆瓣相册 library(RCurl) library(XML) myHttpheader <- c("User-Agent"="Mozilla/5.0 (Wi ...
- PHP-FPM运行状态的实时查看及监控详解
https://www.jb51.net/article/97640.htm https://blog.csdn.net/Dr_cokiy/article/details/105580758
- CSS3实现字体描边
CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...