OSI与TCP/IP各层的结构与功能,都有哪些协议?
应用层
应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间的通信和交互规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为报文
运输层
运输层的主要任务就是负责两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。”通用的“是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个进程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可以同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层的相应进程。
运输层主要使用一下两种协议:
- 传输控制协议TCP(Transmission Control Protocol )提供面向连接的,可靠的数据传输服务。
- 用户数据协议 UDP (User Datagram Protocol) 提供无连接的,尽最大努力的数据传输服务 (不保证数据传输的可靠性)
网络层
在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据封装成分组和包进行传送。在TCP/IP 体现结构中,由于网络层使用 IP协议,因此分组也叫 IP数据报,简称 数据报。
这里要注意 : 不要把运输层的 ”用户数据报 UDP “ 和 网络层的 IP 数据报 弄混。另外,无论是哪一层的数据单元,都可以笼统地用 ”分组“ 来表示。
这里强调指出,网络层中的 ”网络“ 二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Protocol)和许多 路由选择协议,因此互联网的网络层也叫做 网际层或IP层。
数据链路层
数据链路层通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束。这样,数据链路层在收到一个帧后,就可以从中提出数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网路中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
物理层
在物理层上所传送的数据单位是比特。**物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。**使其上面的数据链路层不必考虑网络的具体传输介质是什么。”透明传送比特流“表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
在互联网使用的各种协议中最重要和最著名的就是TCP/IP 两个协议。现在人们经常提到的TCP/IP并不一定单指TCP和IP这两个具体的协议,而往往表示互联网所使用的整个TCP/IP协议族。
请详细介绍一下TCP的三次握手机制,为什么要三次握手
首先建立链接前需要Server端先监听端口,因此Server端建立链接前的状态就是LISTEN状态,这时Client端准备建立链接,先发送一个SYN同步包,发送完同步包后,Client端回复一个ACK。
由于TCP是双工传输,Server端也会同时向Client端发送一个SYN,申请Server向Client方向建立链接。发送完ACK和SYN后,Server端的链接状态就变成了SYN_RCVD。
Client收到Server的ACK后,Client端的链接状态就变成了ESTABLISHED状态,同时,Client向Server端发送ACK,回复Server端的SYN请求。
Server 端收到 Client 端的 ACK 后,Server 端的链接状态也就变成了的 ESTABLISHED 状态,此时建连完成,双方随时可以进行数据传输。
-
为什么需要握手?
握手是为了建立双向的链接
TCP是协议具有一个重要的特性 可靠性,可靠性体现在,假如client端发送一个消息给server端,并不是Client发完就完了,如果server端没有回复收到了,那么client就会一直重发,一定要server端回复收到了,这个消息才算发送成功。
-
为什么是3次
客户端和服务端都需要知道各自可收发,因此需要三次握手。
C发起请求连接
S确认,也发起请求
C确认
第一次握手:S只可以确认自己可以接受C发送的报文段
第二次握手: C可以确认S收到了自己发送的报文段,并且可以确认自己可以接受S发送的报文段
第三次握手 S可以确认C收到了自己发送的报文段
详解四次挥手
TCP链接的关闭,通信双方都可以先发起,我们暂且把先发起的一方看作Client,从图中看出,通信中Client和Server两端的链接都是ESTABLISHED状态,然后 Client先主动发起了关闭链接请求,Client向Server发送了一个FIN包,表示Client端已经没有数据要发送了,然后Client进入FIN_WAIT_1状态。
Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。此时 Server 属于半关闭状态,因为此时 Client 向 Server 方向已经不会发送数据了,可是 Server 向 Client 端可能还有数据要发送。
当 Server 端数据发送完毕后,Server 端会向 Client 端发送 FIN,表示 Server 端也没有数据要发送了,此时 Server 进入 LAST_ACK 状态,就等待 Client 的应答就可以关闭链接了。
Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态。TIME_WAIT 状态下需要等待 2 倍的最大报文段生存时间,来保证链接的可靠关闭,之后才会进入 CLOSED 关闭状态。而 Server 端收到 ACK 后直接就进入 CLOSED 状态。
这里面试官可能会问为什么需要等待 2 倍最大报文段生存时间之后再关闭链接,原因有两个:
-
保证 TCP 协议的全双工连接能够可靠关闭;
-
保证这次连接的重复数据段从网络中消失,防止端口被重用时可能产生数据混淆。
从这个交互流程可以看出,无论是建连还是断链,都是需要在两个方向上进行,只不过建连时,Server 端的 SYN 和 ACK 合并为一次发送,而断链时,两个方向上数据发送停止的时间可能不同,所以不能合并发送 FIN 和 ACK。这就是建连三次握手而断链需要四次的原因。
另外回答断链的问题时,可以提到实际应用中有可能遇到大量 Socket 处在 TIME_WAIT 或者 CLOSE_WAIT 状态的问题。一般开启 tcp_tw_reuse 和 tcp_tw_recycle 能够加快 TIME-WAIT 的 Sockets 回收;而大量 CLOSE_WAIT 可能是被动关闭的一方存在代码 bug,没有正确关闭链接导致的。
TCP和UDP协议的区别
是否面向连接 | 传输可靠性 | 传输形式 | 传输效率 | 所需资源 | 应用场景 | |
---|---|---|---|---|---|---|
TCP | 面向连接 | 可靠 | 字节流 | 慢 | 多 | 要求通信数据可靠 (如文件传输、邮件传输) |
UDP | 无连接 | 不可靠 | 数据报文段 | 快 | 少 | 要求通信速度高 (如域名转换) |
地址栏键入URL后,发生了什么?
- 浏览器查找域名的IP地址
(DNS查找过程:浏览器缓存、路由器缓存、DNS缓存) - 浏览器向web服务器发送一个HTTP请求
(cookies会随着请求发送给服务器) - 服务器处理请求
- 服务器发回一个HTML响应
- 浏览器开始显示HTML
总体来说分为以下几个过程:
- DNS 解析
- TCP链接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析
- 连接结束
状态码
类别 | 原因短语 | |
---|---|---|
1XX | Inforational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
HTTP长连接,短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器直接用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP和HTTPS的区别
- 端口:HTTP的URL由 ”http://“起始且默认使用端口80,而HTTPS的URL由”https://“起始且默认使用端口443.
- 安全性和资源消耗:HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP安全性没有HTTPS高,但是HTTPS比HTTP耗费更多的服务器资源。
- 对称加密:密钥只有一个,加密解密为同一个密码,且加密解密速度快,典型的对称加密算法有DES、AES等
- 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
TIME_WAIT 和 CLOSE_WAIT的区别在哪
CLOSE_WAIT是被动关闭形成的;当对方close socket而发送FIN报文过来时,回应ACK之后进入CLOSE_WAIT状态。随后检查是否存在未传输数据,如果没有则发起第三四挥手,发送FIN报文给对方,进入LAST_ACK状态并等待对方ACK报文到来
TIME_WAIT是主动关闭连接形成的;处于FIN_WAIT_2状态时,收到对方FIN报文后进入TIME_WAIT状态;之后再等待两个MSL(Maximum Segment Lifetime :报文最大生存时间)
TIME_WAIT的作用,为什么状态时间要保持两个MSL
- TIME_WAIT的作用是为了保证最后一次挥手的ACK报文送达给对方,如果ACK丢失,对方会超时重传FIN,主动关闭端会再次响应ACK过去;如果没有TIME_WAIT状态,直接关闭,对方重传的FIN报文则被响应一个RST报文,此RST会被 动关闭端被解析成错误
为什么状态时间要保持两个MSL
- 保证TCP协议的全双工连接能够可靠关闭
- 保证这次连接的重复数据段从网络中消失,防止端口被重用时可能产生数据混淆。