IOS —— 网络那些事(中) - TCP/IP 协议随笔_banlong6430的博客-程序员秘密

技术标签: 网络  

因为各种事宜处理了一些时间,今天我们书接上文。

继HTTP协议之后,以白话文的讲一讲什么是TCP/IP? 

理解片面、不足的地方请大神们好好指教一番。那么let's begin


 1.TCP/IP 协议的定义

(图片来源于网络)

这个是当今运行的网络七层表示图(并不完整),至下而上数分别是

1.物理层2.数据链路层3.网络层4.传输层5.会话层6.表示层7.应用层

其中编号1到3层是由网络工程师作为主要研究对象。

上篇文章讲到的HTTP协议所在的层数为7.应用层

这篇文章提到的TCP/IP协议分别作用在4层和3层

TCP协议处于传输层IP协议处于网络层。他们俩者一起合称的中文翻译是网络传输协议。正如字面意思

TCP/IP协议的意思,亦或者说作用就是 网络传输。

每一层都有其各自的作用

例刚才提及到的HTTP协议所在的应用层,主要解决的是如何包装数据,让其展示在应用上。

TCP/IP协议所在的网络、运输层主要解决的是数据传输的问题。


2.TCP协议建立连接

HTTP是有他自身的连接方式的,那么TCP有吗?

当然有,HTTP是基于TCP协议所创造的,TCP协议当然也有自身的连接

只不过TCP协议建立连接的时候比较复杂,必须都得经历一个三次握手,四次挥手的过程

在我的白话文解读之前,先看看专业术语是怎么解释的

三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

1.png

 

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

四次挥手

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

2.png

 

由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:

3.png

 

我相信很多人初次看完这些专业的图文解读大多数都是不理解所表示的含义的,但是细读倆遍还是会有点收获的

比如说我,三挥四握在我看来是怎么样的呢?

先从三次挥手说起

模拟下这么一个场景

我走在路上,遇到了一个好哥们。和他打起招呼。

此时我作为发送方,主动打起招呼: 嗨,哥们去干嘛呀?

如果此时这位好哥们带着耳机听不见我说话,那么他并不会回应

当他听见我的话的时候,代表第一次对话成功。但是此时他不做出回应是不能建立起聊天

如果他此时做出了应答:嘿哥们,怎么你也在这? 这代表着第二次对话成功。当他回应的时,经由这俩次对话证实了这位好哥们听到并且听懂我说的话。

这时我也能接收到这位好哥们的回应时,代表着第三次对话成功,双方沟通已经无障碍可以开始无节制的开始聊天了。

是的,三次握手就是这么个回事,需要互相能接收并回应自身后才能建立起连接。只要有一方在握手阶段处于未响应时,这次对话(连接)就宣告不成功。

这时候结合上面的专业释义理解一下?是不是就明白了不少了?

 

接下来还有四次挥手,也是同理

这里我们再模拟一个场景

我和好哥们已经聊了好久天,已经没东西聊了(NO DATA)。于是乎我主动说道:“哥们,我们已经没东西聊了,家里人催促我回家,就不聊先回家了哦”!(发起关闭请求)

此时我是不能直接离开的,离开会显得特别没礼貌没教养。所以我开始等待好哥们(wait1)的回复,等待了片刻后好哥们听明白我的意思并回复:“哦哦哦,早点回去吧!那我们就不聊啦。”

在等待(wait2)好哥们说再见时会出现俩种情况

1.紧接着在片刻后好哥们说:“和你聊天真的很愉快,我这边也有事要处理,再见啦~”。好哥们就先行离开了。(主机close,并且告知发送方)

听到话语后我回复他:“再见啦,有空再约!”。(发送方close,连接结束关闭)

2.好哥们说完话上一句之后就直接离开了,显得没礼貌。这时候处于绅士立场思考问题,还是得在原地等一会等个说法,然而2分钟过去了(time wait)才发现好哥们是真的离开了。

我就默认好哥们(判断主机已经close)已经把想说的话说完了,没礼貌就没礼貌吧,就先行离开回家了。(发送方close,连接关闭)

 


 

情景模拟就再此结束了,虽然说现实中没有那么扯的情景,但是毕竟是模拟嘛,计算机语言就是这么循规蹈矩。结合下专业术语,指不定你就了解了呢?

那么这里有关这篇文章的部分就结束了。下一篇文章讲的是socket,也就是网络那些事的终章了!

转载于:https://www.cnblogs.com/UUUUgua/p/9945931.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/banlong6430/article/details/101655534

智能推荐

PCB信号完整性有哪几步_如何确保PCB设计信号完整性_恋风恋歌的干货铺的博客-程序员秘密

       信号完整性(Signal Integrity, SI)是指信号在信号线上的质量,即信号在电路中以正确的时序和电压作出响应的能力。如果电路中信号能够以要求的时序、持续时间和电压幅度到达接收器,则可确定该电路具有较好的信号完整性。反之,当信号不能正常响应时,就出现了信号完整性问题。  随着高速器件的使用和高速数字系统设计越来越多,系统数据率、时钟速率和电路密集度都在不断地增加。在这种...

使用 node-inspector调试nodejs应用程序_wyf2005的博客-程序员秘密

1、npm install node-inspector2、启动 node-inspector~/$ node-inspector info - socket.io startedvisit http://0.0.0.0:8080/debug?port=5

【晒出你的第83行代码】跬步千里,十二年的老代码更是技术的沉淀!_weixin_34380781的博客-程序员秘密

最近社区有个很火的《向代码致敬,寻找你的第83行》的活动,缘起于前几天,在阿里巴巴的一个小黑屋里,5名对代码有着极致追求的程序员参与了阿里代码领域最高荣誉“多隆奖”最终角逐(多隆作为淘宝的第一代程序员,也是很多技术人心中的大神)。那天代码评审现场,看到某代码片段最后结尾,多隆突然补上一句,往上翻看下第83行。代码一般都是几百行,他看到最后,居然还记得第8...

【图像处理】 最大类间方差算法(Otus算法)_otsu算法_Zhang_Chen_的博客-程序员秘密

1.最大类间方差算法(Otus算法)的原理;2.OpenCV中的Otus算法

SW-X框架 的安装与部署_草泥猪520的博客-程序员秘密

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架SW-X 依赖于PHP-Swoole扩展,所以在运行SW-X之前,我们需要先安装Swoole扩展。###1、安装Swoole4.8.0wget http://pecl.php.net/get/swoole-4.8.0.tgztar -zxvf swoole-4.8.0.tgzcd swoole-4.8.0phpize# 注意:这里的php安装目录要改成你项目所在的./configure --with-php-con

K-Means聚类算法的4个步骤流程!_kmeans聚类算法流程_大圣众包平台的博客-程序员秘密

聚类分析是我们数据挖掘中常用的算法,常常用于没有分类,但又有相关相似性的样本研究当中,包括了K-Means、K-中心点和系统聚类三种算法,各自有各自的特点和适用环境。今天我们大圣众包根据网络资源详细介绍下K-Means聚类算法。  首先,先看看K-Means聚类算法是什么?一般来说,K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距

随便推点

前端 websocket长连接请求数据_前端长连接_管家金闪闪的博客-程序员秘密

前端 websocket长连接,前端实现方法,需后台配合定义在methods的方法getSoket(){ let that = this; let socket; if(typeof(WebSocket) == "undefined") { console.log("您的浏览器不支持WebSocket"); }else{ console.log("您的浏览器支持WebSocket"); //浏览器支持的、请求

线性回归,损失的定义,损失函数与优化方法,用统计学习方法来理解线性回归、损失函数和优化方法,Sklearn使用方法_sklearn线性回归损失函数_JJH的创世纪的博客-程序员秘密

目录1.线性回归一元线性关系多元线性关系2.损失:评估预测结果与真实值的偏差程度误差累积的结果总损失计算公式:损失函数:最小二乘法3.损失函数的优化方法4.用统计学习方法来理解线性回归、损失函数和优化方法5.Sklearn API接口与使用方式波士顿房价预测案例参考文档1.线性回归线性回归属于监督学习的回归问题的一类,由于回归问题的目标值是连续的,所以线性回归算法的目标是寻找连续的目标值之间的一种趋势,通过获取这种趋势来建立模型。得到测试集后,将特征值

为什么这么多人都学不会Java,找不到Java工作?还不是方式不对_chengxuyuan9527的博客-程序员秘密

现在有很多人想转行学习Java,原因只有一个,想要拿到更高的薪资。而确实如此,在大部分岗位中程序员的薪资确实是比较高的,而且行业的上升空间会相对大一些,有更多的创业机会。Java程序员的工资分布大概是这样的,根据我在这个行业的经验来看,我认为大部分的Java程序员薪资肯定可以达到2W,只不过是时间的问题,而如果想要超过2W,就是一个坎。有一些比较优秀的人可能会成为架构师或者是项目经理,拿到四五十万的年薪完全没有问题。还有在一些二三线小城市,薪资大概也就是10K-15K封顶了。所以从收入来看,Java程序

android xml对应java_Android获取系统路径(java获取& xml获取)_南哥塔罗占卜师的博客-程序员秘密

Java代码中获取路径Environment.getDataDirectory() = /dataEnvironment.getDownloadCacheDirectory()= /cacheEnvironment.getExternalStorageDirectory() = /mnt/sdcardEnvironment.getExternalStoragePublicDirectory(“te...

WebRTC--rtc_base库移植_urce\win_webrtc\src\rtc_base/system/rtc_export.h ._china_jeffery的博客-程序员秘密

rtc_base是webrtc的基础库,也是一个不可多得的跨平台的基础库,它提供了线程、网络、指针等多个方面的支持。 我们可以将它单独提取出来加以改造,然后使用。 rtc_base库位于src\rtc_base文件夹中。 我们将其移到单独的visual studio工程中,并使用cl.exe编译为静态库。 虽然使用gn gen --ide=vs out/Debug命令生成的visual

SDL_BlitSurface的参数是两个PNG时,如何保护其透明度_robinxb1991的博客-程序员秘密

原文 https://bugzilla.libsdl.org/show_bug.cgi?id=68#c2Description Davide Coppola2006-01-23 04:32:53 ESTI have tried to blit a PNG with an alpha channel on a transparent surface created using

推荐文章

热门文章

相关标签