本文主要是介绍c++面经汇总(计算机网络),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
请你说一下TCP是怎样保证可靠连接的,并且简述一下TCP建立连接和断开连接的过程
TCP保证可靠连接有三个条件
- 序列号、确认应答、超时重传:当客户端的数据到达发送方的时候,发送方需要发出一个确认应答,表示已经接收到该数据段,并且确认序号会说明它下次需要接收的数据序列号,如果发送方没有收到应答确认,那么可能是在发送的过程中有数据丢失的现象,也可能是确认应答丢失,这是发送方会等待一段时间之后,进行重传,一般是等待2*往返事件+一个偏差值
- 窗口控制:TCP会利用窗口控制来提高运输速度,意思是在一个窗口大小内,不需要一定等到应答才能发送下一段数据,窗口的大小就是无需等待确认而可以继续发送数据的最大值,如果没有窗口的控制,那么每发送一个数据段,都必须要等待一个确认才能继续发送,如果没有收到,必须要进行重传,当使用窗口控制的时候,如果某段数据丢失,如101-201丢失,那么接收方每次的确认应答都会是101的应答,如果接收方连续三次接收到同样的应答,那么会立刻进行重传;如果在过程中应答数据丢失,那么不会进行重传,因为只要是数据段没有丢失,那么接收端就不会不断的去提醒;
- 拥塞控制:如果把窗口最开始设定的很大,发送端连续的发送大量的数据,可能造成网络拥堵,TCP为了解决这样的事情发生,采取了拥塞控制的机制,拥塞控制有三步;
- 慢启动 :在最开始的时候设置的窗口很小为1,然后每次接收到应答都表示现在的网络比较畅通,这个时候就将窗口更改为原来的两倍
- 拥塞避免:在慢启动里面,如果一直的将窗口大小以两倍的速度去扩大,那么就会导致很快就会造成拥堵,所以当慢启动机制将窗口的大小更改到系统设置的阙值之后,窗口的值不再以2倍的速度扩大,而是每个银达窗口大小+1,依此来避免拥塞;并且将超时重传看作是拥塞,因此,当发生超时重传的时候,将阙值设定为当前窗口的一半,然后将窗口的大小恢复到初值1,重新进入慢启动的过程
- 快速重传:在遇到3次重复确认应答,代表收到了三个报文段,但是之前有个报文段丢失了,因此会对丢失的这个报文段立即重传,然后将阙值设定为当前窗口的一般,然后将窗口的大小设定为慢启动阙值+3的大小
通过者三种可靠性保证的机制,就可以在TCP通信的时候,网络吞吐量沉陷逐渐上升,并且随着拥堵来降低吞吐量,然后再慢慢上升,网络不会轻易的发生瘫痪
TCP建立连接和断开连接的过程
首先要知道TCp报文段的首部格式,才能更好的知道上图中的各种字段代表什么意思,如下
- 源端口和目的端口:各占两个字节,分别写入源端口号和目的端口号
- 序号:占四个字节,由于TCp是面向字节流的,因此在一个TCp连接中传送的字节流中的每一个字节都是按照顺序编号的,整个要传送的字节流的起始序号必须在连接建立时试着,首部的序号字段是指,本报文段所发送的数据的第一个字节的序号,如一个报文段的序号字段值是301,一共100个字节,那么最后一个字节的序号应该是400,显然,限一个报文段的数据的第一个字节的序号就是401
- 确认号:占用四个字节,是期望收到对方下一个报文段的第一个数据字节的序号,如B正确收到了A发送来的一个报文段,其序号字面值是501,而数据长度是200,这表明B收到了A发送的到序号700为止的数据,因此B期望收到的A的下一个数据的数据序号为701,于是B在发送给A的确认报端中应当把确认号置为701;
- 数据偏移:占四位,他指出数据的起始位置到TCP报文段的首部起始位置有多远
- 保留,保留以后使用,目前置为0
下面是六个控制位 - 紧急URG 当URG置为1的时候,表示紧急指针字段有效,它的意思 是,告诉系统此报文段中有紧急数据,应当立即发送,比如,已经发送了一个很长的程序要在主机上运行,但是后来发现了一些问题,需要取消该程序的运行,这个时候就需要将其置为1,优先发送,取消程序的运行,这样的话可以避免所有数据都被运行结束了,才收到取消运行的指令,造成时间上的浪费;
- 确认号ACK 仅当ACK=1的时候,确认字段才有效,当其为0的时候无效,TCP规定,在建立连接之后所有传送的报文段都必须把ACK置为1;
- 推送PSH:当两个应用进程进行交互式的通信时,优势在一段的应用进程希望在键入一个命令后立即能收到对方的相应,在这种情况下,TCp就可以使用推送操作,这个时候发送方TCP把PSH置为1,并且立即创建一个报文段发送出去,接收方TCp收到PSH = 1 的报文段,就尽快的交付接收应用进程,而不用等到真个缓存都填满了以后再向上交付了;
- 复位RST (reset):当RST = 1时,表明TCP的连接中出现了严重错误(如由于主机崩溃或者其他原因),必须释放连接,然后重新建立传输连接,RST还用来拒绝一个非法的报文段或者拒绝打开一个连接;
- 同步SYN 在连接建立的收用来同步序号,当SYN = 1 而ACK = 0时,表明这是一个连接请求报文段,如果对方同意建立连接,则应该在相应的报文段中使SYN = 1,ACK =1,因此SYN置1 就表示这是一个连接请求或连接接受的报文段
- 终止FIN 用来释放一个连接,当FIN= 1 的时候,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接
- 还有几个字段,自行上网去查吧。。。具有这六个控制位的定义理解就可以弄懂TCp建立连接的过程了
三次握手:
- 当client将标志位SYN(同步标志位),同时选择一个出实序号seq = x,TCP规定SYN报文段(SYN = 1 的报文段)不能携带数据,但是要消耗掉一个序号,这个时候TCp客户端进程进入SYN-SENT(同步已发送)状态。
- 当server收到client的连接请求报文段之后,如果同一建立连接,则向client发送取人,在确认报文段的时候应当把SYN(同步号)和ACK(确认号)位置都置为1,确认号ack = x+1,同时也为自己选择一个初始序号seq = y ,注意,这个报文段也不能携带数据,但是同样也要消耗掉一个序号,这个时候TCp服务器进入SYN-RCVD(同步收到)的状态
- TCPclient收到server的确认之后,还要向Server发送确认,确认报文段将ACk置为1,确认号ack = y+1,而自己的序号seq = x+1,这个时候client进入ESTABLISHED(已建立连接的状态)
- 当server收到client的确认之后也进入ESTABLISHED(已建立连接的状态)
四次挥手(连接释放)
- 现在客户端与服务器都处于ESTABLISHED(已建立连接的状态),例如现在客户端的应用进程先向其TCp连接释放报文段,并停止再发送数据,主动关闭TCp连接,那么客户端释放报文段的首部终止控制位FIN置1,其序号为seq = u,它等于前面已经发送完的数据最后一个字节+1 这个时候客户端进入FIN-WAIT-1(终止等待1)状态,等待B的确认,请注意,TCp规定FIN报文段即使不懈怠数据,他也将消耗掉一个序号
- 当服务器收到连接释放报文段后发送确认,确认号为ack = u+1,而这个报文段自己的序号时v,等于服务器已经传送过的数据的最后一个字节的序号+1,然后服务器就进入CLOSE-WAIT(关闭等待状态),即客户端已经没有数据要发送了,但是服务器若发送数据, 客户端仍要接收,也就是说从服务器到客户端这个方向的连接并未关闭,这个状态可能持续一段时间;
- 客户端收到来自服务器的确认后,就进入FIN-WAIT-2的状态,等待服务器发送的连接释放报文段
- 如果服务器已经没有要向客户端发送的数据,其应用进程就通知TCP释放连接,这个时候服务器发出的释放报文段就必须使FIN(终止位)=1。现假定服务器的序号为w(再半关闭的状态B可能有发送了一些数据),那么服务器必须重复上次发送过的确认号ack = u+1,这时,服务器就进入了LAST-ACK(最后确认状态),等待客户端的确认;
- 当客户端收到服务器的连接释放报文段后,必须对此发送确认,再确认报文段中把ACK置1,并且确认号ack = w+1,而自己的序号使seq = u+1,然后经过是按等待计时器设置的时间2MSL之后,客户端才进入closed状态,
以上就是四次挥手释放连接的流程
至于为什么要等待2MSL的时间之后才能正式的释放呢?
6. 为了保证客户端发送的最后一个ACK报文段能够达到服务器,这个ACK报文段可能丢失,因而再处于LAST-ACK状态收不到对己发送的FIN+ACK报文段的确认,服务器会重发这个FIN+ACK报文段,而客户端就能收到这个重传的报文段,进而重新发送确认,然后重启2MSL,一直到时间结束之后确认服务器接收到确认号,再释放,如果不这样,服务器可能因为接收不到确认而导致无法进入CLOSED状态
7. 为了防止已失效的连接请求报文段,客户端再发送最后一个ACK之后,再经过2MSL时间,就可以使本连接持续的时间内所产生的所有报文段都再网络中消失 ,这样就可以保证下一个新的连接中不会出现这种旧的连接请求报文段;
**“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。
**
请你说一说TCp的模型,状态转移
TCP模型有四层
- 应用层:通过应用进程间的交互来完成特定网络引用。
- 运输层:负责向两台主机中进程之间的通信提供通用的数据传输服务,运输层主要有两种协议:1. 传输控制协议TCP 提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段;2. 用户数据报传输协议UDP 提供无连接的、尽最大阻力的数据传输服务(不包括数据传输的可靠性),其数据传输的单位是用户数据报;(TCP和UDP)
- 网络层:网络层负责位分组交换网上额不同主机提供通信服务,再发送数据时,网络层把运输层产生的报文段或用户数据报分装成分组或包进行传送也叫IP数据报,ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报(IP、ICMP(网际控制报文协议))
- 数据链路层:在两台主机之间的数据传输,总是在一段一段的链路上进行传送的,这就需要使用专门的链路层协议,在两个相邻的节点间的链路上传送数据时,数据链路层将网络层浇下来的IP数据包组装成帧,在相邻节点间的链路上传送帧,每一帧包括了数据和必要的控制信息;(设备驱动程序以及接口卡)
状态转移
服务端的状态转移:
服务端打开以后处于listen状态,等待客户端的连接请求,当服务端收到客户端发来的连接请求SYN(同步标记位)后,服务端进入synreceive状态,并且回复SYN和ACK表示接收连接之后,当服务段再次收到ack后,服务端认为连接已经建立并进入establish状态,当服务端接收到fin = 1 后,表示客户端要关闭连接,这时服务端就进入cloae_wait状态,此时服务端不再接收数据,但是可以继续发送数据,当服务端数据发送完之后,服务端会发送fin并计入lask_ack状态,在服务端收到客户端发来的fin和ack后,服务段关闭连接,处于close状态;
客户端的状态转移:
客户端发送syn = 1后会处于synsend状态,当收到服务端发来的syn和ack后,客户端会返回一个确认ack,发完后会进入establish状态,客户端发送fin = 1主动关闭连接,会处于fin_wait_1状态;
在此状态下,
5. 服务端会回复一个ack表示服务段还能发送数据,此时客户端会进入fin_wait_2状态,表明等待服务段关闭连接
6. 收到服务端发来的fin = 1,此时客户端发送ack,进入closing 状态;
7. 收到服务端发来的fin+ack,此时客户端会发送time_wait状态,等待2MSL会彻底关闭
请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点
HEEP协议和HTTPS协议的区别如下
- HTTP协议时以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,因此HTTPS具有更高的安全性
- HTTPS在TCp三次握手阶段之后,还需要进行SSL的握手,协商加密使用的对称加密密钥
- HTTP协议的端口号时80,HTTPS协议端口号时443;
HTTPS优点:
4. HTTPS传输数据过程中使用密钥进行加密,因此安全性更高
5. HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器
HTTPS的缺点:
6. HTTPS握手阶段延时较高,由于在进行HTTP会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加
7. HTTPS部署成本高:一方面HTTPS协议需要证书来验证自身的安全性,所以需要购买CA整数;另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高;
HTTPS、SSL、TLS三者之间的联系和区别
请你说一说IP地址作用,以及MAC地址作用
IP地址 = {网络号,主机号}
网络号有五种
从图中可以看出,ABC类地址的网络好字段,分别为1个2个3个字节长,在网络号字段前面有1-3位的类别位,其数值规定位0,01,110
ABC类地址的主机号字段分别位3个,2个1个字节长
D类地址用于多播(一对多通信)
E类地址保留为以后用
IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配全世界内唯一的32位标识符
从层次上看,IP地址是网络层和以上各层使用的地址,是一种逻辑地址,而物理地址则是数据链路层和物理层使用的地址
数据流动
在发送数据的时候,数据从高层下到底层,然后菜刀通信链路上传输,使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧了,MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在了MAC帧的首部,连接在通信链路上的设备(主机或者路由器)在收到MAC帧的时候,根据MAC帧首部的硬件地址决定收下或者丢弃,只有当剥去MAC帧的首部和尾巴后,把MAC层的数据上交给网络层之后,网络层才能在IP数据报中找到源IP地址和目的IP地址;
请回答OSI七层模型和TCP/IP四层模型,每层列举两个协议
OSI(开放系统互连基本参考模型)七层模型及其包含的协议如下:
物理层:透明传输二进制比特流,主要的协议包括IEEE802.3z(千兆以太网)、IEEE802.3(CS/MACD媒体访问控制)
数据链路层:将比特流组装成帧进行点对点的传输,传输单位为帧,主要包括的协议位MAC、CSMA/CD
网络层:负责将数据报在不同的主机之间进行传递 IP\ARP\ICMP
传输层:负责向两台主机的进程之间的通信提供数据传输服务TCP/UDP
会话层:建立、管理、和终止会话 RPC NFS
表示层:对数据进行翻译、加密和压缩 JPEG ASII
应用层:通过进程间的交互来完成特定的网络应用 HTTP DNS
请你说一说TCp的三次握手和四次挥手的过程及原因
TCP三次挥手
C-> SYN -> S SYN = x
S->SYN/ACK->C SYN = y, ACK = x+1
C->ACK->S ACk = y+1
三次握手的原因:三次握手可以防止已经失效的连接请求报文段突然有传输到了服务端而导致服务端资源的浪费,比如客户端发送了一个连接请求,但是这个请求报文段由于网络的原因在某一个节点滞留了很久,客户端长时间没有收到服务端的回复,又重新发了一次,当这次已经建立好连接之后,第一次发送的请求才到达服务端,服务端会认为这是一次新的连接从而发送SYN,然后一直等待,这个时候会造成资源的浪费,这个时候三次握手由于服务端一直得不到客户端的回复,所以知道客户端没有要求建立连接,也就不会在哪里等待而造成资源的浪费
四次挥手
C->FIN = 1 、seq = u->S 客户端:FIN-WAIT-1状态
S->ACK = u+1、seq = v ->C 客户端:FIN-WAIT-2状态 服务端CLOSE-WAIT状态;
服务端如果没有数据要发送了
S->FIN = 1 ,seq = s ->C 变成s的原因可能时又发送了一些数据 ,这时服务端的状态变成 LAST-ACK
C->ACK->S 此时服务端状态变成closed 客户端等待2MSL状态变成Close
(不懂的话可以看上面四次挥手的过程)
进行四次挥手的原因:由于连接关闭的控制权在于应用层,所以当被动的一方收到FIN包的时候,TCP首先会发送一个ACK确认包,然后关闭一端的通信,然后通知应用层,由引用层决定什么时候发送FIN包;
请你说一说具体网络层的操作应该是怎样的,也就是说网络编程的基本步骤是什么
服务端:socket-bing-list-accept
客户端:socket-connect
请你说说,传递到IP层是怎么知道报文该传递给那个应用程序
IP层不需要知道报文要交给那个应用程序,它只确定要传到那一台设备上(根据IP),然后将报文交给上层传输层,由传输层TCP/UDP首部的端口号确定应用层的进程(应用程序)。
这篇关于c++面经汇总(计算机网络)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!