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连接)的更多相关文章

  1. 前端浅谈-协议相关(http/https)

    当DNS工作完之后得到了一个网址 https//192.168.1.255/index.html 这个并不符合标准的请求路径.接下来就是https的功能了.讲https前先讲讲它的前身http协议 H ...

  2. 前端浅谈-协议相关(DNS协议)

    从应用层到实体层的协议太多了,我们并不能一一涉及,目前来说就打算整理可能会与前端相关的协议. 前端面试常会问到一个问题-"从输入一个url到页面渲染经历了哪些过程".这其实是一个相 ...

  3. FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接

    一.为什么写这个 昨天遇到个ftp相关的问题,关于ftp匿名访问的.花费了大量的脑细胞后,终于搞定了服务端的配置,现在客户端可以像下图一样,直接在浏览器输入url,即可直接访问. 期间不会弹出输入用户 ...

  4. OSI七层协议与TCP连接

    概述 为了追求效率,我们写代码,不可能去关注底层知识,但往往到出了问题,或者性能调优.我们就会速手无策,仔细为自己查缺补漏,总结知识点. 网络协议 互联网的本质就是一系列的网络协议,让不同计算机能够互 ...

  5. 浅谈HTTP和TCP的理解

    TCP协议对应于传输层,而Http协议对应于应用层,Http协议是建立在TCP协议之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.HTTP会通过TCP建立一个连接通道,当HTT ...

  6. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  7. 浅谈Http、TCP、UDP和 IP 的的区别

    应用层:Http,超文本传输协议(HyperText Transfer Protocal):利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发起HTTP请求 ...

  8. 智能车学习(二十)——浅谈C车硬连接与软连接

    一.为何要追求软连接?       车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...

  9. 浅谈协议(四)——wireshark强力解析视频流协议

    参考链接: https://wenku.baidu.com/view/460f016e49d7c1c708a1284ac850ad02de800722.html https://wenku.baidu ...

随机推荐

  1. 菜鸡的Java笔记 类图

    类图        1.如何实现类图的描述        2.时序图的使用                    从实际i的开发标准:应该在项目编写钱设计类图        而现在的开发大部分情况下, ...

  2. 基于Netty4手把手实现一个带注册中心和注解的Dubbo框架

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  3. Netcat基础使用

    netcat命令选项 本文参考文章链接 本文参考文章链接1 本文参考文章链接2 本文参考文章链接3 常用命令选项 ## 网络模式和代理相关 -l 监听,作服务器.不填时作客户端. -u UDP模式.不 ...

  4. 同时在多个 Git 分支上工作,老板要榨干我

    背景 上一篇文章 保持清洁的Git提交记录,三招就够了 ,大家看过后有私下留言说这是非常好用的功能,我突然想到工作中用到的另外一个 Git 功能那也是相当好用,必须全盘托出 作为程序员的我们应该都有一 ...

  5. 【玩具】使用Python自动化发送微信消息进行订水

    事情是这样的,我知道淘宝上有卖一种USB接口的大按钮,估计是给工厂或者医院之类的场景设计的,样子长这样: 然后我就一直挺想搞一个的,不为别的,就是玩,但是想来想去也没想到这玩意儿对我而言能有啥用途,就 ...

  6. 24:WEB漏洞-文件上传之WAF绕过及安全修复

    本课重点 案例1:上传数据包参数对应修改测试 案例2:safedog+云服务器+uploadlabs测试 案例3:safedog+云服务器+uploadlabs_fuzz测试 案例4:文件上传安全修复 ...

  7. [APIO2020]有趣的旅途

    注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...

  8. Codeforces 1188D - Make Equal(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 首先我们考虑枚举最后这 \(n\) 个数变成的值 \(v\),那么需要的操作次数即为 \(\sum\limits_{i=1}^n\text ...

  9. C++面试基础篇(二)

    1.数组与指针的区别 数组下标运算实际上都是通过指针进行的. 数组名代表着指向该数组中下标为0的元素的指针,但有例外:sizeof(数组名)返回整个数组的大小,而非指针大小:&数组名返回一个指 ...

  10. 巩固javaweb第十八天

    提交按钮 只要涉及提交信息,都应该提供一个提交按钮,当点击提交按钮的时候,用户输入的 信息将提交给服务器,意味着输入过程的结束.注册界面中也包含一个提交按钮. 提交按钮的基本格式如下: <inp ...