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. layui使用html+servlet+ajax实现登录验证

    我们一般使用的都是form表单提交到Servlet来实现前端和后端的交互的.这次我使用的是ajax提交数据,实现登录操作. 首先我们需要的是一套layui模板,这里用到layui的js和css界面. ...

  2. C语言通过指针数组和二维数组读取文件

    1 # include <stdio.h> 2 # include <stdlib.h> 3 # include <time.h> 4 # include < ...

  3. [bzoj1037]生日聚会

    dp,用f[i][j][x][y]表示i个男孩,j个女孩,以i+j为结尾的子序列男-女最多为x,女-男最多为y的合法方案数,转移到f[i+1][j][x+1][max(y-1,0)]和f[i][j+1 ...

  4. 列生成算法(求解Cutting Stock问题)

    列生成是用于求解大规模线性优化问题的一种算法,其实就是单纯形法的一种形式.单纯性可以通过不断迭代,通过换基变量的操作,最终找到问题的最优解.但是当问题的规模很大之后,变量的个数就会增大到在有限时间内无 ...

  5. Codeforces 1503E - 2-Coloring(组合数学)

    Codeforces 题目传送门 & 洛谷题目传送门 考虑什么样的 2-染色方式是符合题目要求的,首先蓝.黄颜色所形成的连通块个数必须 \(\le 2\),否则一定不合法,而显然如果两种颜色连 ...

  6. 洛谷 P4646 - [IOI2007] flood 洪水(拆点+bfs)

    题面传送门 一道挺有意思的题(?) orz djq yyds %%%%%%%%%%%%%%%%%% 首先一个很直观的想法是将每个房间看作一个节点,在有墙的房间旁边连边权为 \(1\) 的边然后 bfs ...

  7. Linux服务器查看个人硬盘配额

    quota -uvs

  8. C语言 字符串指针和字符串数组使用区别

    字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...

  9. requests+bs4爬取豌豆荚排行榜及下载排行榜app

    爬取排行榜应用信息 爬取豌豆荚排行榜app信息 - app_detail_url - 应用详情页url - app_image_url - 应用图片url - app_name - 应用名称 - ap ...

  10. 去空格及换行制表符【c#】

    string returnStr = tbxContractNO.Text.Replace("\n", "").Replace(" ", & ...