01 OSI网络模型 + TCP三次握手、四次挥手 + Socket、TCP、HTTP三者之间的区别和原理

目录

七层网络模型

TCP/IP 协议基本概念

 TCP/IP四层模型:

网络七层模型详解

1.物理层

2.数据链路层

3.网络层

4.传输层

5.会话层

6.表示层

7.应用层

TCP三次握手

四次挥手

断开过程:

 socket原理​编辑

 SOCKET连接与TCP/IP连接:

 HTTP连接:

 Socket连接与HTTP连接:

 常见面试题

1. 为什么连接的时候是三次握手,关闭的时候却是四次握手? 

2. 如果已经建立了连接,但是客户端突然出现故障了怎么办?

3. 为什么不能用两次握手进行连接?

4. Socket、TCP、http 各意思? 



七层网络模型


(简称OSI模型):
OSI 模型(Open System Interconnection model)是一个由国际标准化组织提出的概念模型,试图供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的接口。了解 OSI 模型有助于理解实际上互联网络的工业标准——TCP/IP 协议。OSI 模型各层间关系和通讯时的数据流向如图所示:

  • 下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置:

  • 常见的 应用层协议: 以下协议的端口号都是固定死的
  • 记住http 和 https 的区别:https是http安全版 ,端口号443。http端口号80

 

TCP/IP 协议基本概念

OSI 模型所分的七层,在实际应用中,往往有一些层被整合,或者功能分散到其他层去。TCP/IP 没有照搬 OSI 模型,也没有 一个公认的 TCP/IP 层级模型,一般划分为三层到五层模型来描述 TCP/IP 协议。

在此描述用一个通用的四层模型来描述,每一层都和 OSI 模型有较强的相关性但是又可能会有交叉。

TCP/IP
的设计,是吸取了分层模型的精华思想——封装。每层对上一层提供服务的时候,上一层的数据结构是黑盒,直接作为本层的数据,而不需要关心上一层协议的任何细节。

TCP/IP 分层模型的分层以以太网上传输 UDP 数据包如图所示:

数据包:
宽泛意义的数据包:每一个数据包都包含"标头"和"数据"两个部分."标头"包含本数据包的一些说明."数据"则是本数据包的内容。

细分数据包:
应用程序数据包: 标头部分规定应用程序的数据格式.数据部分传输具体的数据内容.——对应上图中的数据!

TCP/UDP数据包:
标头部分包含双方的发出端口和接收端口. UDP数据包: '标头’长度:8个字节,"数据包"总长度最大为65535字节,正好放进一个IP数据包. TCP数据包:
理论上没有长度限制,但是,为了保证网络传输效率,通常不会超过IP数据长度,确保单个包不会被分割. ——对应上图中的UDP数据!

IP数据包:
标头部分包含通信双方的IP地址,协议版本,长度等信息. '标头’长度:20~60字节,"数据包"总长度最大为65535字节. ——对应上图中的IP数据

以太网数据包:
最基础的数据包.标头部分包含了通信双方的MAC地址,数据类型等.
'标头’长度:18字节,'数据’部分长度:46~1500字节. ——对应上图中的以太网数据

 TCP/IP四层模型:

 

CP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。TCP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。TCP/IP分层模型的四个协议层分别完成以下的功能:

第一层:网络接口层
包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address
Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。
第二层:网间层
对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information
Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control MessageProtocol,ICMP)用来提供网络诊断信息。
第三层:传输层
对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use Datagram Protocol)提供不可靠的用户数据报服务。
第四层:应用层
对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等,这也是本书将要讨论的重点。
 


网络七层模型详解


1.物理层


1.1实现两台机器互联,机器和机器之间如何通信?
最开始的需求是把两台机器联接起来,让它们通信。物理层就根据这个需求运用而生。

物理层实现了什么功能呢?

它提供了肉眼可见的物理介质,比如网线(双胶线)、光纤、无线电波,这些都可以实现机器之间的基本连接。

1.2机器间的通信是以什么样的形式存在呢?
像这样的一个信息在物理介质里面其实就是一个计算机语言,比如说:0101二进制的一个形式存在。

在专业名词里这个二进制也叫做电信号(比特流)。物理层的出现能够让两台电脑通过物理介质发送比特流了。

比特流还是0101这样一个机器的语言,这种0101的比特流其实是一个没有什么意义的一个数据。怎么让它变成一个有意义的数据呢?

2.数据链路层


针对这个需求,就产生了数据链路层。对无意义的比特流进行分组,这些0101的二进制的电信号,对这些二进制以8个为一组。8位一组形成了一个字节,这样的一个数据被它进行分组之后,然后根据这个分组,依次按顺序发送数据。

2.1这样的数据就会变成一个有特殊意义,上面层级能够认识的数据,这就是数据链路层实现的第一个需求。
虽然数据变成机器间可以认识的一个有意义的数据,但是机器收到这个数据怎么知道这个数据是发给我的呢?

2.2怎么确认这个数据是发给我的呢?网络中是怎么去定义这个事情?
数据链路层定义了mac地址。机器都有一个网卡,(电脑-以太网-适配器-详细信息,可以看到无线网卡的物理地址,其实就是每一块网卡的独有的地址,理解成这个网卡的身份证)。mac地址是唯一的,mac地址就是标识这台机器的物理地址,现在如果电脑a发给电脑b一个信息,需要带上mac地址。

就像寄信,寄信的时候需要写寄件人的地址和收件人的地址。

对应物理网卡,物理网卡其实也有个原mac地址,把自己mac地址带上,也会带上收件人的地址(目的地址),就知道我要发给谁并告诉对方是谁发的,方便对方给我回信。

那它就知道应该向谁去回复。这个就是通过mac地址解决的。

2.3数据链路层的数据格式:帧。
通过数据链路层,计算机之间可以正常传数据包,但是现在有2个主机,一个主机a,主机f,两台主机间通信,但是中间隔着bcde主机,它们两个不是直接连接的机器,它们两个怎么实现直接通信呢?

如果两个主机离得特别远,中间可以实现通信的路径有很多条,怎么选择最近的路径通信呢?

数据链路层通过mac地址识别对方主机和自身的主机,怎么知道对方的mac地址?

3.网络层


3.1第一个解决怎么知道对方的mac地址?
定义了一个协议:arp的协议,实现的功能就是做地址解析,通过ip地址去知晓对方的mac地址。

3.2第二个需求:主机a和主机f之间隔着很多别的主机,两个主机可能不在一个子网里面,就没办法直接通信。去判断它们两个是否在一个子网,怎么判断?
定义了一个协议:ip协议去判断发送者和接收者是否在同一个子网,怎么发送数据。

3.3路径很多,怎么选择最优的路径?
网络层同样定义了一组协议,就是路由协议。

一组路由协议:静态路由协议,动态路由协议(rip,ospf,bgp协议)。这些都是常用的动态路由协议。

这三个需求都是网络层给大家解决的问题。网络层是最关键的一层,实现的功能特别多。

数据包在网络里可以正常发送了,如果发送的数据特别的多或者单个数据包特别大,在网络中传输需要很长的时间,中间的网络中断了,怎么才能保证重传?

如果重传,怎么确定数据包完整且正确?

4.传输层


实现的第一个功能,对发送的数据进行一个封装。

通过tcp协议和udp协议封装的。这2个协议对数据包进行封装后,让数据包一个一个按顺序依次发送。

这样封装能够保证数据包是完整且准确的。还有一个功能,就是两台主机,都是用两个应用进行通信(例如两个人qq聊天)。

所以,怎么判断我的电脑上的qq发送给你的,你就是用qq回应的呢?

我的电脑上不止一个应用程序,那我怎么判断你是用qq接收数据而不是用别的呢?

也是通过传输层实现,定义了端口的概念,实现应用程序的寻找。

当数据包到达传输层后,会有一个端口,然后呢,我们的应用程序通过端口寻找到对应的程序,就去发给对应程序进行数据处理。

5.会话层


如果数据特别大,中断需要重传,是不是不应该重头开始传,应该断点续传,就由会话层实现的。

会话层:从校验点继续恢复数据进行重传。这个功能对网络上的数据传输很重要(大文件传输)。

实现了自动收发包的功能以及自动寻址的功能。

6.表示层


计算机有很多的操作系统:windows/mac/linux系统。

各种系统间的语法不一样的。不同系统间进行通信的话,这个就是表示层的工作了。

其实就是一个翻译的工作,提供一种公共语言,让不同系统间可以进行通信。

表示层和会话层没有定义协议的功能,所以没有定义协议。

7.应用层


有了6个层级的工作,都是为了应用层服务的。

用户在浏览器访问百度界面,属于应用层的操作。

数据已经从一个主机上的应用传到另一个主机上的应用了,这样一个基本的功能是可以实现的。

但是数据包从底层传上来,只有物理层的时候进行了一个组装,在数据链路层形成了一个字节流。

上面层级并没有重新进行一个数据的组装,到了上面依然是一个字节流的格式,不好被应用识别和操作。

所以应用层通过定义了各种应用协议来规范一个数据的格式。

比如最熟悉的http协议,https协议,ftp协议,dns协议,tftp协议,smtp协议。这些都是应用层定义来规范数据的格式,方便系统、软件、程序进行识别和操作。


原文链接:https://blog.csdn.net/weixin_41033105/article/details/121299245


TCP三次握手


TCP/IP连接(在互联网的通信中,永远是客户端主动连接到服务端):
手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

建立起一个TCP连接需要经过“三次握手”:
  第一次握手: 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
  第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。
1、握手过程:

序列号seq: 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack: 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK: 占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN: 用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。注意: ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

 

四次挥手

  • 断开过程:

  • 下面是网络四次挥手的详细过程:

  • 第一次挥手(FIN):当客户端想要关闭连接时,它会向服务器发送一个终止请求(FIN)。这个FIN报文段通知服务器,客户端没有更多的数据要发送了,但是仍然可以接收服务器发送的数据。

  • 第二次挥手(ACK):服务器收到客户端的FIN请求后,会向客户端发送一个确认报文(ACK)来确认收到FIN。服务器此时可能还有一些未发送完的数据需要发送给客户端。

  • 第三次挥手(FIN):当服务器准备关闭连接时,它会向客户端发送一个终止请求(FIN)。这个FIN报文段通知客户端,服务器没有更多的数据要发送了,但是仍然可以接收客户端发送的数据。

  • 第四次挥手(ACK):客户端收到服务器的FIN请求后,会向服务器发送一个确认报文(ACK)来确认收到FIN。一旦服务器收到这个ACK报文,它就知道两边都已经关闭连接。

  • 完成了以上四次挥手后,连接就被正式关闭了。双方都知道彼此不会再发送数据,并且可以安全地释放连接所占用的资源。

    需要注意的是,四次挥手过程中,每一方都需要发送一个终止请求(FIN),以及对方的确认(ACK)。在第二次和第四次挥手中,还可能会带上未发送完的数据。这是因为TCP是全双工的协议,允许同时进行双向的数据传输。


  • 断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次挥手”

 

 

 socket原理

 SOCKET连接与TCP/IP连接:

 HTTP连接:

 Socket连接与HTTP连接:

 


 常见面试题

1. 为什么连接的时候是三次握手,关闭的时候却是四次握手? 

答:
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
 

2. 如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
 

3. 为什么不能用两次握手进行连接?

 答:
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

4. Socket、TCP、http 各意思? 

答:
两个计算机进行网络通讯的时候用tcp协议发数据,双方就能收到数据。仅仅是收到数据但是无法解析数据。
http就是解决了浏览器和服务器通信数据的格式的解析。
socket,是支持TCP/IP协议的网络通信的最小操作单元(tcp的封装)若我们建立套接字的时候,指定用tcp连接,socket就是tcp连接

原文链接:https://blog.csdn.net/weixin_44278698/article/details/124744562 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值