第八周:网络协议及管理配置

1、简述osi七层模型和TCP/IP五层模型

认识协议

“协议”是一种约定。
计算机之间传输媒介是光信号和电信号,通过“频率“和”“强弱”来表示0、1这样的信息,想要传递不同的信息,需要约定好双方的数据格式。
网络协议是一个共同标准,大家都来遵守。
为了让两台主机通信,需要协议和标准的数据格式才能进行通信。

协议分层(分层最大的好处就是便于封装

OSI七层模型:

OSI七层网络模型称为开发式系统互联网参考模型,是一个逻辑上的定义和规范;把网络从逻辑上分为七层,每一层都有相应的物理设备;OSI七层网络模型是一种框架式的设计方法,最主要的功能就是帮助不同类型的主机实现数据传输;最大的优点就是将服务、接口和协议三个概念明确的区分起来;复杂且不实用;经常使用的是TCP/IP四层模型。

各部分及功能:

  1. 应用层:针对你特定应用的协议
  2. 表示层:设备固定的数据格式和网络标准数据格式之间的转化
  3. 会话层:通信管理,负责建立和单开通信连接,管理传输层 以下分层
  4. 传输层:管理两个节点之间的数据传递。负责可靠传输
  5. 网络层:地址管理和路由选择
  6. 数据链路层:互联设备之间传送和识别数据帧
  7. 物理层:界定连接器和网线之间的规格
TCP/IP四(五)层模型。

每一层都呼叫它的下一层提供的网络来完成自己的需求。(如果是四层模型数据链路层和物理层在一层)

  1. 物理层:负责光电信号传递方式。集线器工作在物理层。以太网协议。
  2. 数据链路层:负责设备之间的数据帧的传输和识别。交换机工作在数据链路层。例如网卡设备的驱动,帧同步,冲突检测,数据差错校验等工作。
  3. 网络层:负责地址管理和路由选择。路由器工作在网络层。
  4. 传输层:负责两台主机之间的数据传输。
  5. 应用层:负责应用程序之间的沟通。网络编程主要针对的就是应用层。
  • 传输层和网络层的封装在操作系统完成。应用层的封装在应用程序中完成。
    数据链路层和物理层的封装在设备驱动程序与网络接口中完成。


    20180827235215579(1).png

关系


20180827235251899(1).png
  • 一般而言: 对于一台主机,它的操作系统内核实现了传输层到物理层的内容
  • 对于一台路由器,它实现了从网络层到物理层
  • 对于一台交换机,它实现了由数据链路层到物理层
  • 对于集线器,他只实现了物理层。
TCP/IP与OSI模型的区别
  • 相同点

    两者都是以协议栈的概念为基础

    协议栈中的协议彼此相互独立、

    下层为上层提供服务

  • 不同点

    OSI先有模型;TCP/IP先有协议,后有模型

    OSI是国际标准,适用于各种协议栈;TCP/IP只适用TCP/IP网络中

    两者的层次数量不同

参考:https://blog.csdn.net/ffsiwei/article/details/82121010,侵删。

2、总结描述TCP三次握手四次挥手

写在前面:

个人认为如果要必须先要理解为什么分层,每一层对应什么协议,每一层实现的功能,才能更好的去答这道题

首先分层就是为了更好的封装和解封装数据,数据自上而下进行传输时,从前往后依次被附加了以太网包首部、IP包首部、TCP包首部(或UDP包首部)以及应用自己的包首和数据。而包的最后则被添加了以太网包尾。

每个包首部中至少包含两个信息:一个是发送端和接收端地址,另一个是上一层的协议类型。

经过每个协议分层时,都必须有识别包发送端和接收端的信息。以太网会用MAC地址,IP会用IP地址,而TCP/IP则会用端口号作为识别两端主机的地址。

而TCP是传输层对应的协议,三次握手和四次挥手对应的就是一个连接从建立到断开的过程,因此此处要分析一下TCP包头的结构


20180717201939345(1).jpg
  • 源端口、目标端口:计算机上的进程要和其它进程通信是要通过计算机端口的,而计算机的一个端口某一时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536个端口。
  • 序列号(seq):表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按照编号排序,由于序号由32位字节表示,所以没2^32个字节,就会出现序号回绕,再次从0开始。
  • 确认号(ack):表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送数据的第一个字节数据的编号为此确认号。
  • 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长,它指出TCP报文段的数据起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节。
  • URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
  • ACK确认:表示是否前面确认号(ack)字段是否有效。只有当ACK=1时,前面的确认ACK=1时,前面的确认号ack才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
  • PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。
  • RST:如果收到1个RST=1的报文,说明与主机的连接出现了严重的错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的报文段又被称为复位报文段。
  • SYN:在建立连接时使用,用来同步序号,当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前面两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
  • FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕了,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段。
  • 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由window size value*window size scaling factor(此值在三次握手阶段TCP选项window scale协商得到)得出此值
  • 校验和:提供额外的可靠性
  • 紧急指针:标记紧急数据在数据字段中的位置
  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节。

了解了以上的TCP报文结构,就可以来解释这道题目中的建立连接时3次握手和释放连接4次挥手的过程了。

首先

3次握手的过程:

20180717202520531.png

  • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态(同步已发送),等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1)即服务器希望客户端随后发送x+1这个序号的数据包,同时服务器也发送一个SYN包(syn=y),即SYN+ACK包,,此时服务器进入SYN_RECV状态(同步收到);
  • 第三次握手:客户端收到服务器发送的SYN+ACK包,知道自己可以发送下一个包了,于是向服务器发送ACK确认包(ack=y+1),表示服务器可以发送下一段报文seq=y+1的包了,这个包发送完毕后,客户端和服务器就都进入ESTABLISHED(TCP连接成功)状态,完成三次握手,开始数据传送。

关于理解TCP数据报文中的序号SEQ和确认号ACK

此时A主机向B主机发送SEQ=100的包
B主机收到A主机发来的SEQ=100的包,回应A主机ACK=101,表明A主机发送的第100个包收到了,同时B主机向A主机发送自己SEQ=1000的包
A主机收到B主机发来的ACK=101,SEQ=1000的包,就理解了B已经收到了刚刚SEQ=100的包了,可以发送SEQ=101的包了,
同时A主机也要回应B主机ACK=1001,SEQ=101,表明自己已经收到了B主机的SEQ=1000的包了,B主机可以发送下一个包了,同时将自己SEQ=101的包发送
B主机收到A主机发来的ACK=1001,SEQ=101,就理解了A已经收到了刚刚SEQ=1000的包了,可以发送SEQ=1002的包了,
同时B主机也要回应A主机ACK=102,SEQ=1002,表明自己已经收到了A主机的SEQ=101的包了,A主机可以发送下一个包了,同时将自己SEQ=1002的包发送

4次挥手(TCP释放连接时)

48540923dd54564e5260495ce0006487d0584fb6.jpeg
  • 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序列号+1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文即使不携带数据,也要消耗一个序号。
  • 服务器收到连接释放报文,发出确认ACK=1,确认号ack=u+1,并且带上字节的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是若服务器发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT(关闭等待)状态持续的时间。
  • 客户端收到服务器的确认请求后,此时客户端就进入了FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  • 服务器将最后的数据发送完毕后,就向客户端发送FIN=1,ack=u+1,由于在半关闭状态,服务器很可能发送了一些数据,假定此时的序列号为seq=w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号时seq=u+1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意,此时TCP连接还没有释放,必须经过2倍的MSL(最长报文段寿命,查阅资料MSL一般为2秒,2倍的MSL即4秒)的时间后,当客户端撤销相应的TCP后,才进入CLOSED状态(连接关闭)。
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态(连接关闭),同样撤销TCP后,就结束了此次TCP连接,可以看到,服务器结束TCP的连接要比客户端早一些,因为客户端要等待2倍的MSL时间。

当然,光理解了TCP的3次握手和4次挥手在面试时显然是不够的,我们要考虑到灵魂追问的场景。

(本人多年以前学网络的时候也是对于三次握手稀里糊涂的,知道多年以后重新温习三次握手的时候,才真正明白了为什么说TCP连接时可靠的,就是因为三次握手必须要双方都要确认对方收到了自己的确认,其中参考了某位大佬的博文https://blog.csdn.net/qq_38950316/article/details/81087809,这里其实也说明如果有些知识当时不懂,可以先暂时放一放,给脑子一个缓冲的时间,回头再来翻一翻,理解TCP报文背后的结构的每一个字段是什么意思,在结合图例可能就看懂了)

【问题1】为什么连接的时候时3次握手,而关闭连接的时候需要4次挥手呢?

答:
因为当Server收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK的报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是当关闭连接时,当Server端收到FIN(关闭连接)报文时,很可能并不会立即关闭SOCKET(套接字,是各自通信连接中的端点,是一个抽象概念,套接字上联应用程序进程,下联网络协议簇,是应用程序与网络协议交互的接口,因此套接字是由IP地址和端口结合的,例如192.168.1.1:23,一个TCP连接应该包含两个套接字,即Server端和Client端的),所以只能先回复一个ACK报文,告诉Client端:“你发送的FIN报文我收到了”。只有等到我Server段的数据都发送完了,我才能发送FIN报文给你,因此不能一起发送。所以需要4次挥手。

【问题2】为什么TIME_WAIT状态需要2倍的MSL(最大报文段生存寿命)才能进入CLOSED状态?

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

【问题3】为什么不能进行2次握手?

答:
3次握手的重要性就在与双方都要做好数据发送的准备工作(即双方都知道彼此已经准备好了),也要允许双方就初始seq序列号进行一个协商,才知道自己该从什么顺序开始发送报文,这个seq在握手的过程中被发送和确认。

我们假设3次握手改成了2次握手,死循环的可能性是会发生的。作为例子,考虑计算机S与C之间的通信,假定C给S发送了一个连接请SYN(请求连接)报文,S收到了这个报文,并发送了确认ACK,按照两次握手的协定,S认为TCP连接已经建立了,可以开始发送数据了,可是,S发送给C的确认ACK和序列号在传输中丢失了,那么C将不知道S是否已经准备好了,也不知道S建立了什么样的序列号,甚至怀疑S是否收到了自己的SYN(请求连接)报文,在这种情况下,C认为TCP连接还没有建立成功,那么将忽略S发来的认为数据,专门只等待S的确认ACK和序列号。而S发现自己发出的数据没有回应,那么将不断的重传相同的数据,这样就形成了一个死循环。
综上,3次握手时为了确认双方都已经做好了建立连接的准备,并且已经协商好了彼此的初始序列号(即报文的第一个字节的顺序)。

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

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

3、描述TCP和UDP区别
参考:https://blog.csdn.net/weixin_33858249/article/details/91731668

tcp是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。使用TCP协议传输数据,TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。当数据从A端传到B端后,B端会发送一个确认包(ACK包)给A端,告知A端数据我已收到!

UDP协议就没有这种确认机制,这就是为什么说TCP协议可靠,UDP协议不可靠,提供这种可靠服务,会加大网络带宽的开销,因为“虚拟信道”是持续存在的,同时网络中还会出现大量的ACK和FIN包。TCP协议提供了可靠的数据传输,但是其拥塞控制、数据校验、重传机制的网络开销很大,不适合实时通信,所以选择开销很小的UDP协议来传输数据。UDP协议是无连接的数据传输协议并且无重传机制,会发生丢包、收到重复包、乱序等情况。
1.基于连接与无连接。
2.UDP不提供可靠性,不能保证数据能够到达目的地。
3.对系统资源的要求(TCP较多,UDP少)。
4.UDP结构较简单。
5.TCP面向字节流模式,TCP会保证服务端按顺序接收到全部的字节流,UDP面向数据报模式,不保证顺序性。

很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,选择TCP协议。当强调传输性能而不是传输的完整性时,如音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如DNS交换。UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260