目录
请你说一下TCP怎么保证可靠性,TCP建立连接和断开连接的过程
请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点?
请你说说传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
7、拥塞控制和流量控制的区别?(Nagle算法,滑动窗口等等)
10、keepalive如何理解(tcp的,http的,应用层心跳heart-beat)
16、http1.0,http1.1,http2.0,https区别 https加密原理/请求过程?
19、EWOULDBLOCK EAGAIN EINPROGRESS等errno的含义
请你说一下TCP怎么保证可靠性,TCP建立连接和断开连接的过程
TCP保证可靠性:
(1)序列号、确认应答、超时重传
/* 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。 如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。 这个时间一般是2*RTT(报文段往返时间)+一个偏差值。 */
(2)窗口控制与高速重发控制/快速重传(重复确认应答)
/* TCP会利用窗口控制来提高传输速度, 意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。 如果不使用窗口控制,每一个没收到确认应答的数据都要重发。 使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答, 表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发; 但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发, 因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒... */
(3)拥塞控制
/* 如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵,甚至造成网络的瘫痪。 所以TCP在为了防止这种情况而进行了拥塞控制。 */
TCP建立连接和断开连接的过程:
请你说一说TCP的模型,状态转移
四层TCP/IP模型如下:
其状态转移图如下:
请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点?
HTTP协议和HTTPS协议区别如下:
/* 1)HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS具有更高的安全性 2)HTTPS在TCP三次握手阶段之后,还需要进行SSL 的handshake,协商加密使用的对称加密密钥 3)HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书 4)HTTP协议端口是80,HTTPS协议端口是443 */
HTTPS优点:
/* HTTPS传输数据过程中使用密钥进行加密,所以安全性更高 HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器 */
HTTPS缺点:
/* HTTPS握手阶段延时较高:由于在进行HTTP会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加 HTTPS部署成本高:一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要购买CA证书; 另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高 */
请你说一说HTTP返回码
HTTP协议的响应报文由状态行、响应头部和响应包体组成,其响应状态码总体描述如下:
- 1xx:指示信息--表示请求已接收,继续处理。
- 2xx:成功--表示请求已被成功接收、理解、接受。
- 3xx:重定向--要完成请求必须进行更进一步的操作。
- 4xx:客户端错误--请求有语法错误或请求无法实现。
- 5xx:服务器端错误--服务器未能实现合法的请求。
请你说一说IP地址作用,以及MAC地址作用
MAC地址是一个硬件地址,用来定义网络设备的位置,主要由数据链路层负责。
IP地址是IP协议提供的一种统一的地址格式,为每一个网络和每一台主机分配一个逻辑地址,以此屏蔽物理地址的差异。
搜索baidu,会用到计算机网络中的什么层?每层是干什么的
/* 浏览器中输入URL 浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求。 DNS查询分为两种方式,一种是递归查询,一种是迭代查询。 如果是迭代查询,本地的DNS服务器,向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器, 然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。 DNS服务器是基于UDP的,因此会用到UDP协议。 得到IP地址后,浏览器就要与服务器建立一个http连接。 因此要用到http协议,http协议报文格式上面已经提到。 http生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。 如果采用https还会使用https协议先对http数据进行加密。 TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。 TCP的数据包然后会发送给IP层,用到IP协议。 IP层通过路由选路,一跳一跳发送到目的地址。 当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP), 以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。 */
请你说说传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
根据端口区分;
看ip头中的协议标识字段,17是udp,6是tcp
1、tcp与udp的区别
1. Tcp 面向连接,提供可靠的传输; UDP面向无连接,提供不可靠传输
2. Tcp 提供流量控制 ; UDP不提供流量控制
3. Tcp 保证传输数据顺序 ; UDP不保证传输顺序,也就是可能是乱序收包
4. TCP 面向字节流 ; UDP 面向数据包
/* 1) 连接 TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接。 UDP无连接。 2) 服务对象 TCP是点对点的两点间服务,即一条TCP连接只能有两个端点; UDP支持一对一,一对多,多对一,多对多的交互通信。 3) 可靠性 TCP是可靠交付:无差错,不丢失,不重复,按序到达。 UDP是尽最大努力交付,不保证可靠交付。 4)拥塞控制,流量控制 TCP有拥塞控制和流量控制保证数据传输的安全性。 UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。 5)报文长度 TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的。 UDP面向报文,不合并,不拆分,保留上面传下来报文的边界。 6) 首部开销 TCP首部开销大,首部20个字节。 UDP首部开销小,8字节。(源端口,目的端口,数据长度,校验和) */
2)TCP和UDP适用场景
从特点上我们已经知道,TCP 是可靠的但传输速度慢,UDP 是不可靠的但传输速度快。
- 若通信数据完整性需让位与通信实时性,则应该选用TCP 协议(如文件传输、重要状态的更新等);
- 反之,则使用 UDP 协议(如视频传输、实时通信等)。
2、udp调用connect有什么作用?
除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。
我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。
内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。
对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。
其实一旦UDP套接字调用了connect系统调用,那么这个UDP上的连接就变成一对一的连接,但是通过这个UDP连接传输数据的性质还是不变的,仍然是不可靠的UDP连接。一旦变成一对一的连接,在调用系统调用发送和接受数据时也就可以使用TCP那一套系统调用了。
1、我们再也不能给输出操作指定目的IP地址和端口号。也就是说,我们不使用sendto,而改用write或send。写到已连接UDP套接字上的任何内容都自动发送到由connect指定的协议地址。可以给已连接的UDP套接字调用sendto,但是不能指定目的地址。sendto的第五个参数必须为空指针,第六个参数应该为0.
2、不必使用recvfrom以获悉数据报的发送者,而改用read、recv或recvmsg。在一个已连接UDP套接字上,由内核为输入操作返回的数据报只有那些来自connect指定协议地址的数据报。这样就限制一个已连接UDP套接字能且仅能与一个对端交换数据报。
3、由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接的UDP套接字不接收任何异步错误。
来自任何其他IP地址或断开的数据报不投递给这个已连接套接字,因为它们要么源IP地址要么源UDP端口不与该套接字connect到的协议地址相匹配。
UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时,才可以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信TFTP,这种情况下,客户和服务器都可能调用connect。
3、可靠UDP编程。(eg::KCP)
4、tcp连接中时序图,状态图。
5、TIME_WAIT状态
tcp结束连接怎么握手,TIME_WAIT状态是什么,为什么会有TIME_WAIT状态?哪一方会有TIME_WAIT状态,如何避免TIME_WAIT状态占用资源(同理,CLOSE_WAIT)
TIME_WAIT 状态也称为 2MSL 等待状态。每个具体 TCP 实现必须选择一个报文段最大生存时间 MSL(Maximum Segment Lifetime)。
(四次挥手主动关闭的一方就会产生这个状态)
//setsockopt(SO_REUSEADDR)用在服务器端,socket()创建之后,bind()之前
SO_REUSEADDR的能力:
//(1)SO_REUSEADDR允许启动一个监听服务器并捆绑其端口,即使以前建立的将端口用作他们的本地端口的连接仍旧存在; //【即便TIME_WAIT状态存在,服务器bind()也能成功】 //(2)允许同一个端口上启动同一个服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可; //(3)SO_REUSEADDR允许单个进程捆绑同一个端口到多个套接字,只要每次捆绑指定不同的本地IP地址即可; //(4)SO_REUSEADDR允许完全重复的绑定:当一个IP地址和端口已经绑定到某个套接字上时,如果传输协议支持
6、tcp头多少字节(20)?哪些字段?
7、拥塞控制和流量控制的区别?(Nagle算法,滑动窗口等等)
8、connect非阻塞编程如何实现?
9、如果select返回可读,结果只读到0字节,什么情况?
10、keepalive如何理解(tcp的,http的,应用层心跳heart-beat)
11、列举你所知道的tcp套接字选项,并说明其作用。
SO_LINGER、
/* 本选项指定close函数对面向连接的协议(例如TCP和SCTP,但不是UDP)如何操作。 默认操作是close立即返回,但是如果有数据残留在套接字发送缓冲区中,系统将试着把这些数据发送给对端。 */
SO_KEEPALIVE、
/* 设置保持存活选项后,如果2小时内在该套接字的任何一方向上都没有数据交换,TCP就自动给对端发送一个保持存活探测分节。 这是一个对端TCP必须响应的TCP分节,会导致以下三种情况: 1、对端响应ACK,应用进程也不会得到任何通知(因为一切正常),接下来2小时若仍无动静,TCP将再次发送分节 2、对端以RST响应,它告知本端TCP:对端已崩溃且已重新启动。该套接字的待处理错误被置为ECONNRESET,套接字本身则被关闭 3、对端没有任何响应,TCP将另外发送8个探测分节,两两相隔75秒,在发出第一个探测分节后11分15秒内没有得到任何响应则放弃,待处理错误为ETIMEOUT,套接字本身被关闭 然而如果收到一个ICMP错误作为某个探测分节的响应,那就返回相应错误,套接字被关闭。(常见的ICMP错误为“主机不可达”) 本选项的公用是检测对端主机是否崩溃或变得不可达。 如果对端进程崩溃,它的TCP将跨连接发送一个FIN,这可以通过select很容易检测到。 同时也要认识到,即使对任何探测无响应,我们也不能认定主机崩溃,因而TCP可能会终结一个有效的连接。 某个中间路由崩溃一段时间也是有可能的 本选项一般由服务器使用。(客户端也可) */
SO_SENDBUF、SO_RECVBUF、
//每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小
SO_RESUEADDR、SO_REUSEPORT
//SO_REUSEADDR的能力: //(1)SO_REUSEADDR允许启动一个监听服务器并捆绑其端口,即使以前建立的将端口用作他们的本地端口的连接仍旧存在; //【即便TIME_WAIT状态存在,服务器bind()也能成功】 //(2)允许同一个端口上启动同一个服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可; //(3)SO_REUSEADDR允许单个进程捆绑同一个端口到多个套接字,只要每次捆绑指定不同的本地IP地址即可; //(4)SO_REUSEADDR允许完全重复的绑定:当一个IP地址和端口已经绑定到某个套接字上时,如果传输协议支持
12、socket什么情况下可读/可写?
一、下列四个条件中的任何一个满足时,socket准备好读:
/* 1. socket的接收缓冲区中的数据字节大于等于该socket的接收缓冲区低水位标记的当前大小 2. 该连接的读这一半关闭(也就是接收了FIN的TCP连接)。对这样的socket的读操作将不阻塞并返回0 3. socket是一个用于监听的socket, 4. 有一个socket有异常错误条件待处理. */
二、下列三个条件中的任何一个满足时,socket准备好写:
/* 1. socket的发送缓冲区中的数据字节大于等于该socket的发送缓冲区低水位标记的当前大小。 2. 该连接的写这一半关闭。 3.有一个socket异常错误条件待处理. */
13、tcp socket什么情况下表示对端关闭
用setsockopt设置超时,在规定时间内根据返回值判断connect不上或者send不成功就是网络故障或者对方关闭了socket.
14、backlog的作用?
backlog曾经的含义:已完成队列和未完成队列里边条目之和 不能超过 backlog;
Linux 2.2 后backlog这个参数指示的是存放已经建立连接(established)并等待被accept的sockets的队列的长度。
15、多进程监听同一个端口?
Unix提供了一个接口setsockopt()可以在bind之前设置套接字选项,其中就包括REUSEADDR这个选项,表明可以多个进程复用bind函数中指定的地址和端口号。
16、http1.0,http1.1,http2.0,https区别 https加密原理/请求过程?
17、CGI和FastCGI的区别?
名称 在web服务器方面 在对数据进行处理的进程方面 cgi fork一个新的进程进行处理 读取参数,处理数据,然后就结束生命期 fastcgi 用tcp方式跟远程机子上的进程或本地进程建立连接 要开启tcp端口,进入循环,等待数据的到来,处理数据
18、http怎么实现的断点续传?
就是在Http的请求上多定义了断点续传相关的HTTP头 Range和Content-Range字段
1. 客户端下载一个1024K的文件,已经下载了其中512K
2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:
Range:bytes=512000-
这个头通知服务端从文件的512K位置开始传输文件
3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务端返回的HTTP状态码应该是206,而不是200。
19、EWOULDBLOCK EAGAIN EINPROGRESS等errno的含义
EAGAIN:没有足够空闲的本地端口。
EINPROGRESS 115:(套接字为非阻塞套接字,且连接请求没有立即完成)
20、epoll
epoll的内核实现;
epoll和select的区别;
epoll的LT和ET模式的区别;
epoll的ET模式怎么编程判断读完(EAGAIN);
手写epoll echo;
21、什么情况下产生RST
//对于每一个TCP连接,操作系统是要开辟出来一个收缓冲区,和一个发送缓冲区 来处理数据的收和发;
//当我们close一个TCP连接时,如果我们这个发送缓冲区有数据,那么操作系统会很优雅的把发送缓冲区里的数据发送完毕,然后再发fin包表示连接关闭;
//FIN【四次挥手】,是个优雅的关闭标志,表示正常的TCP连接关闭;
//反观RST标志:出现这个标志的包一般都表示 异常关闭;如果发生了异常,一般都会导致丢失一些数据包;
//如果将来用setsockopt(SO_LINGER)选项要是开启;发送的就是RST包,此时发送缓冲区的数据会被丢弃;
//RST是异常关闭,是粗暴关闭,不是正常的四次挥手关闭,所以如果你这么关闭tcp连接,那么主动关闭一方也不会进入TIME_WAIT;
22、半打开,半关闭,半连接
一、半连接
1.1 定义
- 发生在TCP3次握手中。
- 如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接。
1.2 半连接攻击
- 半连接,会造成B分配的内存资源就一直这么耗着,直到资源耗尽。
二、半打开(Half-Open)
2.1 定义
- 如果一方已经关闭或异常终止连接,而另一方却不知道。 我们将这样的TCP连接称为半打开(Half-Open)。
三、半关闭
3.1 定义
- TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是TCP的半关闭。
- 当一方关闭发送通道后,仍可接受另一方发送过来的数据,这样的情况叫“半关闭”。(拆除TCP连接是:你关闭你的发送通道,我关闭我的发送通道)。
3.2 半关闭的产生
- 1. 客户端发送FIN,另一端发送对这个FIN的ACK报文段。 此时客户端就处于半关闭。
- 2. 调用shutdown,shutdown的第二个参数为SHUT_WR时,为半关闭。
23、多进程监听同一socket、惊群