概述

为了追求效率,我们写代码,不可能去关注底层知识,但往往到出了问题,或者性能调优。我们就会速手无策,仔细为自己查缺补漏,总结知识点。

网络协议

互联网的本质就是一系列的网络协议,让不同计算机能够互相通信。这个协议就叫做OSI协议,根据不同的功能和分工,人为划分七层,当然你也可以划分五层,4层。实际上这些都是不存在的,只是为了让人更好理解这些都是做什么用的。

物理层:网络通信的数据传输介质,连接不同结点的电缆与设备构成。这些都是专业的说法,其实说白了就是双绞线(网线),光缆这些东西,当然也包括无线电波。传的是比特流,就是0101101。。。这些电信号。

数据链路层:物理地址寻址、数据的成帧、流量控制、数据的检错、重发,负责物理层面的互联,通信传输。接收到比特流,还得人为的分组,让比特流变得有意义的,这就是数据链路层干得活。它以太网协议将电信号分组,一组电信号称之为一个数据包(帧)。然后控制帧在物理信道上传输包括纠错,调节发送速率(防止高速的发送方把低速接收方淹没,需要某种流量控制机制使发送方得知接收方当前还有多少空间)确保数据的可靠性,每一帧都含有报头(head)和数据(data),报头包含发送者(网卡地址),接收者(网卡地址),数据里就是数据包的具体内容。通过数据链路层,我们就可以建立局域网,并让同一局域网络的两台计算机通信,数据链路层就像是一个社区邮差,他认识社区的每户人家,社区中的每个人都可以将信(帧)交给他,让他送给同一社区的另一户人家。

网络层:数据在节点之间创建逻辑链路,通过路由选择算法,按一定的原则在多个节点的通信子网中选择一条到达目的节点的最佳路径过程,说白就是讲数据传输到目标地址。现在我要找另一社区的老王,我写了一封信,交给邮差,邮差并不认识另一个社区的人,就把信交给邮局处理,邮局根据上面的地址(IP)就能查到对应的地址描述,然后交给另一个社区的邮局。这封信可能要多个邮局的转发,才能到达老王手里。

传输层:负责建立和断开通信连接(数据流动的逻辑通路),记忆数据的分隔等数据传输相关的管理。当发送大量数据时,时间有点长,网络可能会发生中断。怎么保证大量数据的准确性,如果我发送的这个文件数据包可能有一万个包,发送一个,就告诉一次,我收到了,丢了就再发一次,保证我都能准确完整接收到数据包,这就是TCP协议(TCP协议是会绑定IP和端口的协议)。与之对应的还有一个UDP协议,适用于发送少量数据,发出去就拉倒,不管你接没接收,在多人游戏中,一般都是UDP协议,即使丢几个包也只是卡一下,但如果网络不好。。那游戏体验能把电脑砸了。

会话层:不同机器上的用户之间建立和管理会话(服务器验证登录,断电续传)。我向老王共享了一个文件夹,老王通过我的IP地址要访问我的共享文件夹(建立会话),这时就会要求他输入我的我脑上的账号密码,这是建立会话过程中的身份验证,权限鉴定。老王从我共享的文件夹拷贝数据,这过程就花了几分钟,然后关闭了和我电脑的共享窗口,这时我又传了一个文件上去。老王有过来连接,这时会发现不需要输入密码就能共享到我文件了,这是因为这条会话还没断开(根据应用层设置的时间维护),身份鉴定环节就省略了(保持会话),这时,电脑卡住了,我无奈重启机器(断开会话),老王重新连接我共享文件夹就要去身份鉴定了。

表示层:处理两个通信系统中交换信息的数据格式变换,数据加密和解密,数据压缩和恢复。我给老王写的一封信,准备早上九点出发去找他,信里的内容是"我上午九点来",可是老王理解成了我九点到他家,虽然信没看错,但因为不同理解,产生了错误的结果。表示层就是专门负责这些有关网络中计算机信息表达方式的问题,除了编码外,还包括数组,浮点数,声音等多种数据结构,以达到在网络中传输的信息双方的解释都是一样的,在计算机内部表示法和网络的标准表示法之间进行转换。

应用层:为应用程序提供服务并规定应用程序中通信相关的细节。

TCP协议三次握手建立连接

两台计算机如何交流,就好比我们两个人,使用同一种语言自然而然的就能表达我们的想法,因此计算机他们也需要定义共通的东西进行交流,TCP/IP为此而生,它不是一个协议而是一个协议家族的统称,它们的成员包括TCP协议,HTTP协议,IP协议等等,本章讲的是TCP协议建立连接和断开连接的过程,客户端程序想要访问服务器某个应用程序就必须发送一个通信请求,经过三次握手建立连接四次挥手终止连接,下面看看具体过程。

位码就是TCP标志位,有6种标示==>建立联机(SYN),确认(ACK),传送(PSH),结束(FIN),重置(RST),USG(紧急)

状态===>CLOSED(初始化状态),SYN_SENT(等待状态),ESTABLISHED(连接建立状态),LISTEN(监听状态),SYN_RCVD(表示接收到SYN报文),

三次握手

  1. 第一次握手:客户端发送位码SYN = 1,seq = 0的数据包到服务器,并进入SYN_SENT状态等待确认,服务器由SYN = 1知道,有客户端要建立联机了。
  2. 第二次握手:服务器收到要确认联机的信息,向客户端发送SYN = 1,ACK = 1,ack number = 1(客户端的seq + 1),seq = 0的数据包,服务器进入接收到报文状态。
  3. 第三次握手:客户端接收到服务器发送的数据包,检查ack number是否是第一次发送的seq + 1,位码ACK是否为1,验证正确。再次向服务器发送一个ack number = 1(服务器发送过来的seq + 1),ack = 1,seq = 1的数据包。服务器收到后确认ack = 1,ack number= 1(服务器seq+1),建立连接成功。

抓包工具查看握手过程

第二次握手

第三次握手

TCP四次挥手断开连接

可以发现,三次握手是客户端先发起的,而四次挥手客户端和服务器都可以率先发起挥手的动作。客户端和服务器总共发送4个包确认连接断开,也形象称为四次挥手。

状态=====>FIN_WAIT1(主动关闭连接,发送FIN报文,进入终止等待1),FIN_WAIT2(终止等待2),TIME_WAIT(等待状态),CLOSE_WAIT(等待关闭状态),LAST_ACK(最后等待状态)

四次挥手

  1. 第一次挥手:数据传输完成后,客户端A发出连接释放报文并停止发送数据,报文的报头中FIN=1,ACK = 1,seq number =73396,ack number = 13704(已经传输完成最后一个字节的序号+1),数据包发送给服务器端,并进入FIN_WAIT1状态。
  2. 第二次挥手:服务器收到这个连接释放报文,发出确认报文,ACK = 1,ack number = 73397,seq number =13704(序列号)给客户端,进入半关闭状态,并且通知高层应用进程,客户端向服务器的方向就释放了。这时,客户端已经没有数据发送了,但服务器如果向客户端发送数据,客户端依然接受,这个阶段就是CLOSE_WAIT状态的持续时间。
  3. 第三次挥手:客户端收到服务器的确认报文后,进入了终止等待2状态,继续等待服务器发送连接释放的报文。服务器把最后的数据发送完毕后,向客户端发送连接释放的报文,FIN = 1,ACK = 1,ack number = 73397,seq number=13704(序列号)发送完后,服务器进入最后确认的状态,等待客户端确认。
  4. 第四次挥手:客户端收到服务器连接释放报文后,必须向服务器发出确认报文,ACK = 1,ack number = 13705,seq number = 73397,然后客户端进入时间等待状态,此时的TCP连接未释放,必须经过2MSL(最长报文寿命)的时间后,客户端撤销相应TCB(传输控制块)后,进入CLOUSED状态,这是因为如果网络不可靠,确认报文可能发丢了,服务器端会不断FIN给客户端,再这2MSL时间内可以重新发一次确认报文,然后再次等待2MSL,如果这时间内没在收到FIN报文,就推断确认报文已经被服务器接收。服务器则只是收到客户端发出的确认,立即进入CLOUSED状态。

抓包工具查看挥手过程

第二次挥手

第三次挥手

第四次挥手

握手要三次?挥手要四次?

TCP协议的双方是双工的,也就是说通信双方都可以向对方发送消息,也都可以独立关闭自己自己一方的通信通道。在这顺便说下半双工,说白了就是不同时,A可以给B发消息,B也可以给A发消息,但A给B发的时候,B不能给A发。三次握手确认两件事,知道双方都准备好了,初始序列号进行确认协商。如果只有两次,可能会造成死锁。客户端给服务器发送请求连接,服务器收到这个请求,并发送确认报文。发送完后,服务器按两次握手的协定,认为连接已经建立,开始发送数据。但这时因为某种原因,服务器的确认报文传丢了,客户端懵逼了,不知道服务器是否收到自己的请求,建立什么序列号。客户端就认为连接还未建立,忽略服务器传来的任何数据,傻傻的等待服务器的确认报文,服务器发出的数据超时后,就重复发出同样数据,死锁就产生了。如果是四次握手哪?四次握手是可行的,但是这样一来会造成资源的浪费,因为三次握手已经确认好所有的事情了,没必要在浪费一次资源。

服务器收到客户端的请求连接报文,立即就可以给应答建立联机了。但关闭连接时,服务器收到这个关闭连接的报文,并不能立即停止,因为还有数据未发送完毕,只能回一个“我知道啦”的应答报文。只有数据全部发送完毕后,服务器才发送说FIN,“我数据传完了”的报文等待确认,然后终止连接。所有需要四次挥手。

===============================================================

如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!!

OSI七层协议与TCP连接的更多相关文章

  1. 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)

    目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...

  2. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  3. OSI七层协议与TCP/IP模型

    OSI为Open System Interconnection的缩写,意为开放式系统互联,国际标准化组织(ISO,International Organization for Standardizat ...

  4. OSI七层协议模型、TCP/IP四层模型

    OSI七层协议模型 TCP/IP四层模型 首先我们梳理一下每层模型的职责: 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据: 网络层:定义IP地址,确认主机所在的网络位置,并通过I ...

  5. OSI 七层模型和 TCP/IP 协议比较

      OSI (Open System Interconnection), 开放式系统互联参考模型.从下到上七层模型功能及其代表协议: 物理层(Physical) :规定了激活.维持.关闭通信端点之间的 ...

  6. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

  7. OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系

    一.OSI七层模型 OSI七层协议模型主要是:应用层(Application).表示层(Presentation).会话层(Session).传输层(Transport).网络层(Network).数 ...

  8. 网络之OSI七层协议模型、TCP/IP四层模型

    13.OSI七层模型各层分别有哪些协议及它们的功能 在互联网中实际使用的是TCP/IP参考模型.实际存在的协议主要包括在:物理层.数据链路层.网络层.传输层和应用层.各协议也分别对应这5个层次而已. ...

  9. 简述OSI七层协议模型、TCP/IP四层模型和五层协议之间的关系

    一.OSI七层模型 OSI七层协议模型主要是:应用层(Application).表示层(Presentation).会话层(Session).传输层(Transport).网络层(Network).数 ...

随机推荐

  1. css 字体两端对齐

    我想作为一个前端工作者,总会遇到这样的场景,一个表单展示的字段标题有4个字也有2个字的时候,这样子同时存在想展示的美观一点,就需要字体两端对齐了,其实实现方式很简单,我针对其中一种来做下介绍,以后方法 ...

  2. python笔记:#012#函数

    函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...

  3. Java容器:Stack,Queue,PriorityQueue和BlockingQueue

    Stack Queue PriorityQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue ...

  4. python 编码形式简单入门

    为什么使用Python 假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux通常是 ...

  5. Servlet知识点总结

    一, ServletAPI中有4个Java包: 1.javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口 2.javax.servlet.http:其中包含定义 ...

  6. java 引用数据类型(类)

    我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用. 第二种,我们自己创建的类,按照类的定义标准, ...

  7. Python_heapq

    import heapq #导入heapq堆模块 import random data = random.sample(range(1000),10) print(data) heapq.heapif ...

  8. .NET Core使用微软官方类库实现汉字转拼音

    一.NuGet包 拼音:Install-Package SimplifiedChinesePinYinConversion 简体-繁体互转:Install-Package TraditionalChi ...

  9. 怎么解决你的小程序有“bug”的问题?

    为了避免小程序在开发运行之后出现"bug"无法知晓,Fundebug研发的小程序bug监控服务作为小程序的运维中心,很好的解决了这个问题. 该插件可以监控小程序中的所有函数调用: ...

  10. spring+jotm+ibatis+mysql实现JTA分布式事务

    1 环境 1.1 软件环境  spring-framework-2.5.6.SEC01-with-dependencies.zip ibatis-2.3.4 ow2-jotm-dist-2.1.4-b ...