《计算机网络面经》网络整理而来
要求:不是简单的描述,而是将整个状态转换过程描述清楚…
服务器端的典型状态转移:
TCP状态转移总图:(粗实线:客户端典型状态转移,粗虚线:服务端典型状态转移,细实线:非典型状态转移)
三次握手(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):
完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
为什么两次不可以:
防止服务器端因接收了早已失效的连接请求报文,从而开启连接,一直等待客户端发送数据,最终导致形成死锁、浪费资源
比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。
为什么不是四次:
可以但没必要,第二、三次可以合并的,四次浪费资源
为什么握手只需要三次,而挥手需要四次呢
因为3次握手可以直接发SYN+ACK,确认报文段跟同步报文段是合一起发的,所以有3次,
挥手时服务器收到FIN时,可能还要数据要发,不能立即关闭连接,所以要先发ACK报文段,如果有数据的话要把数据都传完再发FIN。故连接释放报文段跟确认报文段分开发,所以有4次
不能等待服务端传送完数据直接发送ACK+FIN么?这样只需要三次
因为这样客户机没有等到确认,会以为是超时,会进行超时重传
TIME_WAIT状态等待2MSL
MSL是报文最大生存时间;
主动方发出最后一个ACK包进入TIME_WAIT状态,目的是防止最后一个ACK包对方没接收到:对方在超时后将重发第三次挥手的FIN包。 主动关闭方向被动关闭方发送最后一个ACK:等待ACK到达对方时间MSL+等待FIN超时重传MSL,所以如果2MSL时间没有收到FIN,说明对方安全收到ACK。
如果主动关闭方在TIME_WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,若最后一个ACK丢失,则无法收到被动关闭方重传的FIN报文段,因而也不会再发送一次确认报文段。这样,被动关闭方就无法按照正常的步骤进入CLOSED状态。
当客户端收到服务端的SYN+ACK应答后,其状态变为ESTABLISHED,并会发送ACK包给服务端,准备发送数据了。
如果此时第三次的ACK在网络中丢失,过了超时计时器后,那么Server端会重新发送SYN+ACK包(重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次)。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,Client方能感知到Server的错误,则会关闭这个连接。
三次握手、四次挥手中可能出现的意外情况,会发生什么,参考这篇博客。
UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
所谓的“字节流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。
原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。
所谓的“数据报模式”,是指UDP发送端调用了几次 write,接收端必须用相同次数的 read 读完。UDP是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。
原因:这是因为UDP是无连接的,只要知道接收端的 IP 和端口,任何主机都可以向接收端发送数据。 这时候,如果一次能读取超过一个报文的数据, 则会乱套。
TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
对于可靠性,TCP通过以下方式进行保证:
TCP 利用滑动窗口实现流量控制的机制。滑动窗口(接收窗口rwnd)的大小意味着接收方还有多大的缓冲区可以用于接收数据。
通过接收端发送带有接收窗口大小rwnd的ACK来实现流量控制。
持续计时器:当收到零窗口通知,就启动持续计时器,超时则发送零窗口探测报文段,避免发送端一直接收不到非零窗口的通知而处于死锁的局面(接收端的非零窗口ACK丢了,发送端也无法发送数据报,则接收端也无法再次回复ACK)
拥塞控制就是:防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。判断网络拥塞的依据就是出现了超时。
拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口等于拥塞窗口。
拥塞控制的方法主要有以下四种:(参考《计算机网络第七版谢希仁P232》)
1). 慢开始:慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。直到达到慢开始门限ssthresh。
2). 拥塞避免:达到慢开始门限后,拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。如果发生了拥塞,就减半慢开始门限ssthresh,并从头执行慢开始算法。
3). 快重传:首先接收方要立即发送确认,而不要等到数据接收方自己发送数据时捎带确认。其次,接收方在收到一个 失序的报文段 后也要立即发出 重复确认(因为是累积确认),为的是使发送方及早知道有报文段没有到达对方。快重传算法规定,发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器超时。
4). 快恢复:当发送方连续收到三个重复确认时,就把ssthresh慢开始门限减半,但是接下去并不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
HTTP 是超文本传输协议 Hyper Text Transfer Protocol, 它主要负责web server和web浏览器之间的通讯,HTTP协议把web client (浏览器)的请求发送到一个web server, 并把网页内容从web server返回到浏览器。常用请求包括get和post两种。
HTTPS 是安全超文本传输协议 Secure HTTP, 主要用于在web server和web 浏览器之间进行隐私数据的传输。
GET:对服务器资源的简单请求,GET用于信息获取,而且应该是安全和幂等的。
POST:用于发送包含用户提交数据的请求,POST请求表示可能修改服务器上资源的请求。
HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头
PUT:传说中请求文档的一个版本
DELETE:发出一个删除指定文档的请求
TRACE:发送一个请求副本,以跟踪其处理进程
OPTIONS:返回所有可用的方法,检查服务器支持哪些方法
CONNECT:用于ssl隧道的基于代理的请求
GET与POST是我们常用的两种HTTP Method,二者之间的区别主要包括如下五个方面:
状态码是http响应里的部分,用来描述响应的状态;
2xx:成功处理请求;
3xx:重定向;
4xx:客户端错误;
5xx:服务器错误;
常见状态码:
200:请求被成功接收;
301:永久跳转,完成请求还需进一步操作;
302:临时跳转,完成请求还需进一步操作;
400:客户端请求有语法错误,不能被服务器所理解;
403:没有权限,拒绝访问;
404:访问页面不存在;
500:服务器错误;
503:服务器当前不能处理客户端请求;
Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;
Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。
二者之间存在如下不同:
端口不同:Http与Https使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
开销:Https通信需要证书,而证书一般需要向认证机构购买;
Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
换句话说,HTTPS 跟 HTTP 一样,只不过增加了 SSL。
HTTP 包含如下动作:
HTTP 和 HTTPS 的不同之处
为什么需要 HTTPS ?
超文本传输协议 (HTTP) 是一个用来通过互联网传输和接收信息的协议。HTTP 使用请求/响应的过程,因此信息可在服务器间快速、轻松而且精确的进行传输。当你访问 Web 页面的时候你就是在使用 HTTP 协议,但 HTTP 是不安全的,可以轻松对窃听你跟 Web 服务器之间的数据传输。在很多情况下,客户和服务器之间传输的是敏感信息,需要防止未经授权的访问。为了满足这个要求,推出了HTTPS,也就是基于安全套接字层的 HTTP 协议。
参考这里
对称加密
非对称加密
非对称加密+对称加密——中间人攻击
非对称加密+对称加密+CA认证 = SSL
答案一:
答案二:
涉及各层协议?
应用层:HTTP、DNS、(DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话)
传输层:TCP、 (HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作)
网络层:IP、(ARP)、ICMP、(为数据包选择路由,IP协议进行主要工作)
链路层:PPP、(ARP)(发送IP数据包到达服务器的地址,ARP协议将IP地址转成MAC地址)
ARP协议的用途:网络层使用的IP地址->解析出->链路层使用的硬件MAC地址
(1)首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。
(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的P地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到 ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。