OSI七层参考模型的核心思想:分层

1979年——ISO——国际标准化组织

什么是分层?

属于同一层面的不同功能,其目的和作用相似或相近;不同层面的功能其目的和作用具有明显的差异。每一层都在下一层提供的服务的基础上再提供增值服务

为什么要采用分层

1、更易于标准化

2、降低层次之间的关联性

3、便于学习和理解

应用层(Application Layer)

网络服务与最终用户的一个接口。

协议有:HTTP、 FTP、 TFTP 、SMTP 、SNMP 、DNS 、TELNET、 HTTPS 、POP3 DHCP

表示层(Presentation Layer)

数据的表示、安全、压缩。

格式有:JPEG、ASCll、EBCDIC、加密格式等

会话层(Session Layer)

建立、管理、终止会话。

对应主机进程,指本地主机与远程主机正在进行的会话

传输层(Transport Layer)

实现端到端的传输

定义传输数据的协议端口号,以及流控和差错校验。

端口号——会话层地址(1~65535),其中1~1023为知名端口

协议有:TCP、 UDP,数据包一旦离开网卡即进入网络传输层

网络层(Network Layer)

进行逻辑地址寻址,实现不同网络之间的路径选择。

协议有:ICMP、 IGMP、 IP(IPV4 IPV6)、ARP、RARP

设备:路由器

数据链路层(Data Link Layer)

建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)

将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

设备:网桥、交换机

分类:

逻辑链路控制层(LLC)

介质访问控制层(MAC)

增加了一个FCS(帧校验序列):确保数据完整型——CRC(循环冗余算法)

物理层(Physical Layer)

建立、维护、断开物理连接。

设备:网卡、网线、集线器、中继器、调制解调器

TCP/IP模型

TCP/IP协议族

TCP/IP四层(标准模型)

数据链路层和物理层相辅相成,例如硬件和软件

TCP/IP五层(对等模型)

 PDU(协议数据单元)

应用层——数据报文

传输层——数据段

网络层——数据包

数据链路层——数据帧

物理层——比特流

数据封装与解封装

 封装:

数据包利用网络在不同设备之间传输时,为了可靠和准确地发送到目的地,并且高效地利用传输资源(传输设备和传输线路),事先要对数据包进行拆分和打包,在所发送的数据包上附加上目标地址,本地地址,以及一些用于纠错的字节,安全性和可靠性较高时,还要进行加密处理等等,这个过程就称为数据封装

 解封装:

那么解封装呢?如果说封装是打包的过程,那么解封装就是拆开包装的意思了,它是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业务信息。

每层需要封装的内容

应用层

http——超文本传输协议,基于tcp协议的80端口

ftp——文件传输协议——基于tcp 20、21端口

telent ——远程连接——基于tcp 23端口

dhcp——动态主机配置协议——基于udp 67/68端口

dns——域名解析协议——基于tcp、udp协议 53端口

tftp——简单文件协议——基于udp协议69端口

https(http协议+tls协议)——基于tcp协议端口443端口

传输层——端口号 ,使用tcp、udp协议

tcp与udp的区别

1、tcp协议面向连接的协议、udp是无连接的协议

2、tcp的传输是可靠的、udp的传输“尽力而为”

3、tcp可以分段、udp不行

4、tcp可以实现流空、udp不行

5、tcp传输速度慢,消耗资源较大、udp传输速度快,消耗资源小

使用场景

tcp适用于效率要求较低,但准确性要求较高的场景

udp适用于效率要求较高,但准确性要求较低的场景

什么是面向连接

面向连接就是指设备在传输之前,先使用预备的协议简历建立点到点的连接,然后再传输数据

tcp头部结构

1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行tcp通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。

2、32位序号:一次tcp通信过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行tcp通信,A发送给B的第一个tcp报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的tcp报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个在整个字节流中的偏移。例如,某个tcp报文段传送的数据时字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。另一个传输方向(从B到A)的tcp报文段的序号值也具有相同的含义。

3、32位确认号:用作对另一方发送来的tcp报文段的相应。其值是收到的tcp报文段的序号值加1。假设主机A和主机B进行tcp通信,那么A发送出的tcp报文段不仅携带自己的序号,而且包含对B发送来的tcp报文段的确认号。反之,B发送出的tcp报文段也同时携带自己的序号和对A发送来的报文的确认号。

4、4位头部长度:标识该tcp头部有多少个32bit字(4字节)因为4位最大能表示15,所以tcp头部最长是60字节。

5、6位标志位(即图中的保留6位):标志位有如下几项

  • URG标志,表示紧急指针是否有效
  • ACK标志,表示确认号是否有效。称携带ACK标志的tcp报文段位确认报文段
  • PSH标志,提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收的数据读走,它们就会一直停留在tcp缓冲区中)
  • RST标志,表示要求对方重新建立连接。携带RST标志的tcp报文段为复位报文段。
  • SYN标志,表示请求建立一个连接。携带SYN标志的tcp报文段为同步报文段。
  • FIN标志,表示通知对方本端要关闭连接了。携带FIN标志的tcp报文段为结束报文段。
  • 伪头部校验和,反码相加法,校验网络层中12个字节的内容。——32位源IP,32位目标IP,8保留,8位协议,16总长度

6、16位窗口大小:是tcp流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

7、16位校验和:由发送端填充,接收端对tcp报文段执行CRC算法以校验tcp报文段在传输过程中是否损坏。注意,这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

8、16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切的说,这个字段是紧急指针相对当前序列号的偏移,称为紧急偏移。tcp的紧急指针是发送端向接收端发送紧急数据的方法。

详细请看:https://blog.csdn.net/qq_41727218/article/details/83058268

udp头部结构

 头部结构中各部分的作用:
(1)16位源端口号 记录源端口号,在需要对方回信时选用。不需要时可用全0。
(2)16位目的端口号 记录目标端口号。这在终点交付报文时必须要使用到。
(3)长度 UDP数据报的长度(包括数据和首部),其最小值为8B(即仅有首部没有数据的情况)。
(4)校验和 检测UDP数据报在传输中是否有错,有错就丢弃。该字段时可选的,当源主机不想计算校验和,则直接令该字段为全0。当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给进程。如果接收方UDP发现收到的报文中目的端口号不正确(即不存在对应端口号的应用进程),就丢弃该报文,并由ICMP发送“端口不可达”差错报文交给发送方。

网络层——IP地址,使用IP协议

IP头部结构

版本号(Version):长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)

IP包头长度(Header Length):长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

服务类型(Type of Service):长度8比特。8位

IP包总长(Total Length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。

标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。

协议(Protocol):长度8比特。标识了上层所使用的协议。

头部校验(Header Checksum):长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

数据链路层——MAC地址,使用以太网协议

早期局域网的解决方案,主要依赖MAC地址进行寻址,主要工作在1、2层

物理层—为电信号没有封装

协议号:

UDP:7

TCP:6

ICMP(跨层封装在IP):1

TCP的分段、IP分片

上面的数字代表长度(字节)

MTU(IP分片)——最大传输单元——1500字节

MSS(TCP分段)——数据最大段长度——1460字节

TCP建立会话的过程——三次握手

建立会话是一个双向连接的过程

第一次握手:

客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=x,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手:

服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,确认号ack=x+1,随机产生一个序号值seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手: 

客户端收到确认后,检查确认号ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,随机产生序号seq=x+1,并将该数据包发送给服务器端,服务器端检查确认号ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

TCP断开会话的过程——四次挥手

 第一次挥手:

Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入FIN_WAIT_1状态,这表示Client端没有数据要发送给Server端了。

第二次挥手:

Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。

第三次挥手:

Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Client端进入LAST_ACK状态。

第四次挥手:

Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入TIME_WAIT状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

常见面试题问题

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

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

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题3】为什么不能用两次握手进行连接?

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

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

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

OSI七层参考模型、TCP/IP参考模型、数据封装与解封装、TCP三次握手四次挥手及面试题相关推荐

  1. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义:       这里 ...

  2. python网络通信效率_Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: 这里的客户端一般 ...

  3. Linux网络编程(网络七层协议,TCP/IP,三次握手四次挥手,TCP/UDP的区别)

    1.OSI 7层网络模型 1.网络七层协议 (1)OSI定义了网络互连的七层框架(物理层.数据链路层.网络层.传输层.会话层.表示层.应用层),即ISO开放互连系统参考模型. (2)各层功能定义 这里 ...

  4. 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  5. 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    转载地址: https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 如果对网络 ...

  6. 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程

    一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...

  7. TCP/IP协议 - 三次握手四次挥手(入门易懂版)

    握手通俗理解为两个人见面Say Hai,客户端和服务端建立连接 挥手就可以理解为两个人结束会面,要Say Goodbai,客户端和服务端断开连接 要了解什么是三握四挥,必须要了解一个重要的知识点:什么 ...

  8. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

  9. ssh协议是osi_TCP/IP协议和三次握手四次挥手

    计算机网络体系结构 在计算机网络的基本概念中,分层次的体系结构是最基本的.计算机网络体系结构的抽象概念较多,在学习时要多思考.这些概念对后面的学习很有帮助. 网络协议是什么? 在计算机网络要做到有条不 ...

  10. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

最新文章

  1. PTA数据结构与算法题目集(中文)7-39
  2. python学习之-- mysql模块和sqlalchemy模块
  3. gridView总结
  4. 直播这把“火”,还能烧多久?
  5. LeetCode344——Reverse String(将字符串反转)
  6. mysql异常恢复工具_[MySQL异常恢复]mysql ibd文件恢复
  7. Bootstrap列表组
  8. android音频框架
  9. 栈的基本操作(java)
  10. 论文期刊科普-SCI SSCI CSSCI CSCD和北大核心期刊分别是什么?
  11. EEPROM存储电路(M24C64芯片)
  12. 网站搭建niushop系统,全面搭建,打包app,h5详细教程
  13. 微信公众号和服务器的关系,微信公众号、订阅号、服务号之间的关系和区别
  14. 闰月算法c语言,公历转农历算法-C语言
  15. Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching)
  16. python 抓网卡数据包 解析wifi_某高校校园网WIFI嗅探用户名密码实践
  17. java 米转换公里_java中把米换算成公里的代码是什么?
  18. MySQL数据库实操教程(25)——权限管理
  19. mysql window系统备份远程数据库到本地
  20. windows搭建redis java简易访问客户端

热门文章

  1. numpy—np.tensordot
  2. 深度学习2.0-32.经典卷积网络VGG,GoogleNet,Inception-1
  3. 深度学习2.0-15.随机梯度下降之梯度下降简介
  4. 机器学习之问题建模(一)
  5. 3.1 RNN 循环神经网络 概述(下篇)
  6. 判断一个单链表是否有环及环的链接点
  7. 湖南城市学院计算机题库和答案,湖南城市学院 计算机选择题题库
  8. matlab s函数模板,MATLAB第5章S函数.ppt
  9. centos 修改root密码_Ubuntu、Redhat、Kali、CentOS重置root密码方法汇总
  10. Ubuntu18.04开机卡在“starting Gnome Display Manager”的解决方法