赞
踩
计算机网络是计算机、软工类面试的基础,不管是软件/硬件开发、技术支持还是测试职位,都会涉及到计算机网络的基础知识,本文基于笔者之前的面试准备所做的相关知识整理。本文的主要内容:
OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。
OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。
从上到下介绍每层的功能:
OSI的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用。在这里顺带提一下之前一直被一些大公司甚至一些国家政府支持的OSI失败的原因:
TCP/IP五层协议和OSI的七层协议对应关系如下:
TCP创建过程和链接折除过程是由 TCP/IP 协议栈自动创建的。因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助。
TCP 建立连接,即所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。具体过程如下:
如果是两次握手,有这样一种情况,当 A 发送一个消息给 B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A 会认为这个消息丢失了,然后重新发送消息。当 A 和 B 通信完成后,这个被A认为失效的消息,到达了 B。
对于 B 而言,以为这是一个新的请求链接消息,就向 A 发送确认。对于 A 而言,它认为没有给 B 再次发送消息(因为上次的通话已经结束)所有 A 不会理睬 B 的这个确认,但是 B 则会一直等待 A 的消息。这就导致了 B 的时间被浪费(对于服务器而言,CPU 等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了。
所以有了三次握手的修订,第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判。
TCP 连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
建立连接时,因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。
关闭连接时,当收到对方的 FIN 报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即 close,也可以发送一些数据给对方后,再发送 FIN 报文给对方表示同意关闭连接。因此我们的 ACK 和 FIN 一般会分开发送。
从TCP连接关闭的状态转换关系可以看出,主动关闭的一方在发送完对对方 FIN 报文的确认(ACK)报文后,会进入 TIME_WAIT 状态。TIME_WAIT 状态也称为 2MSL 状态。
什么是2MSL?MSL 即 Maximum Segment Lifetime,也就是报文最大生存时间,引用《TCP/IP详解》中的话:它(MSL)是任何报文段被丢弃前在网络内的最长时间。那么,2MSL 也就是这个时间的 2 倍。最后总结为主动关闭的一方将继续等待一定时间(2-4分钟),使两端的应用程序结束。
为什么需要 TIME_WAIT 状态:
TIME_WAIT 状态所带来的影响:
当某个连接的一端处于 TIME_WAIT 状态时,该连接将不能再被使用。事实上,对于我们比较有现实意义的是,这个端口将不能再被使用。某个端口处于 TIME_WAIT 状态(其实应该是这个连接)时,这意味着这个 TCP 连接并没有断开(完全断开),那么,如果你 bind 这个端口,就会失败。对于服务器而言,如果服务器突然 crash 掉了,那么它将无法再 2MSL 内重新启动,因为 bind 会失败。解决这个问题的一个方法就是设置 socket 的 SO_REUSEADDR 选项。这个选项意味着你可以重用一个地址。
TCP协议保证数据传输可靠性的方式主要有:
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
作为程序开发人员对于一些服务器返回的 HTTP 状态的意思都应该了如指掌,只有将这些状态码一一弄清楚,工作中遇到的各种问题才能够处理的得心应手。所以下面就让我们来了解一下比较常见的 HTTP 状态码吧!
1xx - 信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。如:
2xx - 成功
这类状态代码表明服务器成功地接受了客户端请求。
3xx - 重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。如 304 Not Modified
4xx - 客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。如:
5xx - 服务器错误
服务器由于遇到错误而不能完成该请求。如:
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。