前端浅谈---协议相关(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 ...
随机推荐
- Sentry 官方 JavaScript SDK 简介与调试指南
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- [bzoj1927]星际竞速
考虑没有爆发,那么相当于是带权最小不可交路径覆盖,由于只能从编号小的到编号大的,因此一定是DAG,而DAG的最小路径覆盖可以拆点并跑最大流,那么带权的只需要跑费用流即可(S向i连(1,0)的边,i'向 ...
- vue进行代码排序
<template> <div> <div> <h3>排序 </h3> <button @click="orderByAge ...
- Go IF 条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 以下是在大多数编程语言中发现的典型条件语句的一般形式 ...
- SpringCloud升级之路2020.0.x版-45. 实现公共日志记录
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们这一节在前面实现的带有链路信息的 Publisher 的工厂的基础上,实现公共日志记录 ...
- MySQL全面瓦解28:分库分表
1 为什么要分库分表 物理服务机的CPU.内存.存储设备.连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈.为了解决这个问题,行业先驱门充分发扬了分而治之的思想,对大库 ...
- CF187D BRT Contract
考虑如果哪次经过了红灯则显然已经和出发的时间没关系了. 然后我们需要做的是怎么样找到最近的一个是红灯的点. 然后实际下是我们做一个前缀和:\(L_i = \sum d_i\) 然后求\(\min (L ...
- Codeforces 1383C - String Transformation 2(找性质+状压 dp)
Codeforces 题面传送门 & 洛谷题面传送门 神奇的强迫症效应,一场只要 AC 了 A.B.D.E.F,就一定会把 C 补掉( 感觉这个 C 难度比 D 难度高啊-- 首先考虑对问题进 ...
- CF932F Escape Through Leaf
CF932F Escape Through Leaf 首先, $ O(n^2) $ dp 是很显然的,方程长这样: \[dp[u] = min\{dp[v] + a_u\times b_v\} \] ...
- 62-Binary Tree Level Order Traversal
Binary Tree Level Order Traversal My Submissions QuestionEditorial Solution Total Accepted: 102531 T ...