1 、建立 TCP 服务器的各个系统调用
建立一个TCP服务器需要涉及到以下的几个系统调用:
socket():开启一个套接字
bind():绑定IP地址和端口号,注意绑定的时候,服务器一般是要主动绑定IP地址和端口号的,但是客户端一般是不需要的,因为客户端发送连接的时候,内核会自动分配一个端口号给它。
listen():监听是否有客户端请求
accept():阻塞进程,等待客户端的接入,接入之后产生收发的另外一个套接字,注意客户端的地址和端口号是在accept接收到的参数中找到的
send():有客户端的接入之后,发送数据
receive():有客户端接入之后,接收数据
close():关闭套接字
https://www.jianshu.com/p/a66e4d9e403e
https://blog.csdn.net/qq_37964547/article/details/81429627
2 、socket 网络编程有哪些系统调用?其中close 是一次就能直接关闭的吗,半关闭状态是怎么产生的?
除了上面网络编程的一些常见的系统调用之后,还有客户端的一些调用:
1.connect():客户端主动连接函数,调用这个函数的时候,会添加自己客户端的地址和端口号
2.select():非阻塞监控函数,这个函数非常的重要,一句话说不清楚。
3.poll函数:类似select函数,也出管理处理多个描述符,只是管理集合的方式不太一样。
4.shutdown: 立即关闭进程,不用考虑套接字的引用计数,close并不能,可能还会早上半关闭状态。
首先回答第一个,close并不是一次就能直接关闭,调用close只能将套接字的引用计数减1,可能其他进程还在使用这个套接字,所以并不是直接关闭。
3 、对路由协议的了解与介绍。内部网关协议 IGP 包括 RIP , OSPF ,和外部网关协议 EGP 和 BGP 。
静态路由和动态路由,静态路由用于局域网,内部网络,动态路由用于大型的交换式路由
RIP:基于距离向量的路由协议,通过计算距离来选择路由的路径
OSPF:基于链路状态型的路由,给每一个路径有一个权重,并计算路径的代价最小值,选择这条路径
EGP:外部网关协议
BGP:一种常见的外部网关协议,一种矢量的路由协议,它通过维护IP路由表或‘前缀’表来实现自治系(AS)之间的可达性。
4 、路由协议所使用的算法
由算法主要分以下两类:
总体式路由算法:每个路由器都拥有网络中其他路由器的全部信息,以及网络的流量状态。也叫LS (链路状态)算法。
分散式路由算法:每个路由器只有与它直接相连的路由器的信息,没有网络中每个路由器的信息。也叫DV (距离向量)算法。
https://blog.csdn.net/qq_37006625/article/details/86363943
5 、 TCP 和 UDP 的区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
6 、 TCP 和 UDP 相关的协议与端口号
1.TCP对应的协议:
FTP:定义了文件传输协议,使用21端口。
Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
2.UDP对应的协议:
DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
7 、 TCP ( UDP , IP )等首部的认识( http 请求报文构成)
http://st233.com/blog.php?id=30
8 、网页解析的过程与实现方法
-
用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件。
-
浏览器开始载入html代码,发现标签内有一个标签引用外部CSS文件。
-
浏览器又发出CSS文件的请求,服务器返回这个CSS文件。
-
浏览器继续载入html中部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了。
-
浏览器在代码中发现一个标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码。
-
服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码。
-
浏览器发现了一个包含一行Javascript代码的
9 、在浏览器中输入 URL 后执行的全部过程(如 www.baidu.com )
1.浏览器首先通过查找内部DNS缓存,查不到依次进行系统DNS缓存,路由器缓存,DNS服务器,一步一步找到并解析IP地址。
2.给对应IP地址的服务器发送搞一个http的请求。
3.百度服务器响应请求,发送html的文档
4.浏览器响应接收到的html的文档对象,解析,并显示。
10 、网络层分片的原因与具体实现
原因:每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit)。IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报长度大于1472(1500-20-8=1472,普通数据报)字节,则需要分片之后进行传输。
具体实现:TCP分段,IP分片
11 、 TCP 的三次握手与四次挥手的详细介绍( TCP 连接建立与断开是热门问题)![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7eed0c04d3c90c54049c088603a27f44.jpeg)
https://blog.csdn.net/qzcsu/article/details/72861891
12 、 TCP 握手以及每一次握手客户端和服务器端处于哪个状态( 11 种状态)
1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN.
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT.
3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV
4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。
5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态.
6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT.
7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 .
8)、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /
9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。
10)、CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态,连接结束。
13 、为什么使用三次握手,两次握手可不可以?
为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
https://blog.csdn.net/lengxiao1993/article/details/82771768
14 、 TIME WAIT 的意义(为什么要等于 2MSL )
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
https://blog.csdn.net/qzcsu/article/details/72861891
15 、超时重传机制(不太高频)
超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.
检测丢失segment的方法从概念上讲还是比较简单的,每一次开始发送一个TCP segment的时候,就启动重传定时器,定时器的时间一开始是一个预设的值(Linux 规定为1s),随着通讯的变化以及时间的推移,这个定时器的溢出值是不断的在变化的,有相关算法计算RTO[参考:文章…],如果在ACK收到之前,定时器到期,协议栈就会认为这个片段被丢失,重新传送数据。
16 、 TCP 怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等) ?
1.面向字节流:以流的方式传输,缓存区满了就划分为几段进行传输
2.超时重传:发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送
4.应答机制:3次握手和4次挥手
5.滑动窗口:控制发送方发送窗口的大小,控制流量
6.拥塞控制:控制传输上流量
7.校验:防止数据传输过程中发生的错误
17 、流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征) ?
主要介绍再接收端和发送端速率不匹配的状况下,TCP协议栈滑动窗口动态调整机制产生的一种问题 叫糊涂窗口综合症,
这个问题可以归结为小包的问题,就是由于发送端和接收端上的处理不一致,导致网络上产生很多的小包,之前也介绍过避免网络上产生过多小包的措施,比如Nagle算法。在滑动窗口机制下,如果发送端和接收端速率很不一致,也会产生这种比较犯傻的状态:发送方发送的数据,只要一个大大的头部,携带数据很少。
对于接收端来讲,如果接收很慢,一次接收1个字节或者几个字节,这个时候接收端 缓冲区很快就会被填满,然后窗口通告为0字节,这个时候发送端停止发送,应用程序收上去1个字节后,发出窗口通告为1字节,发送方收到通告之后,发出1个字节的数据,这样周而复始,传输效率会非常低。
同时如果发送端程序一次发送一个字节,虽然窗口足够大,但是发送仍是一个字节一个字节的传输,效率很低。
18 、 TCP 滑动窗口协议
TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。TCP使用肯定确认技术,其确认号指的是下一个所期待数据包的序列号。 假定发送方设备以每一次三个数据包的方式发送数据,也就是说,窗口大小为3。发送方发送序列号为1、2、3的三个数据包,接收方设备成功接收数据包,用序列号4确认。发送方设备收到确认,继续以窗口大小3发送数据。当接收方设备要求降低或者增大网络流量时,可以对窗口大小进行减小或者增加,本例降低窗口大小为2,每一次发送两个数据包。当接收方设备要求窗口大小为0,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。发送方接收到携带窗口号为0的确认,停止这一方向的数据传输。
19 、拥塞控制和流量控制的区别
流量控制:端对端的流量快慢控制,并保证传输的可靠性
拥塞控制:全局网络的拥塞情况,如果有发生丢包则通过拥塞控制减小窗口,确定出合适(慢开始 拥塞避免 快重传 快恢复)的拥塞窗口。
20 、 TCP 拥塞控制,算法名字?(极其重要)
慢开始 + 拥塞避免 + 快重传 + 快恢复
1.慢开始:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。
2.拥塞避免:从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。
3.快重传 :快速重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置重传计时器时间到期
4.快恢复:其实快速恢复并不是单独存在的,它是快速重传的后续处理。通常认为客户端接收到3个ACK后,就会开始快速重传,但是如果还有更多的重复ACK呢,这个时候就是快速恢复要做的。
a、当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(也即cwnd=ssthresh/2).但是接下去并不执行慢开始算法;
b、考虑到此时能连续收到3个ACK,说明网络没有拥塞,执行加法原则,有几个ACK就加几个段的字节数,或者可以将cwnd=ssthresh,直接进入拥塞避免算法。
https://blog.csdn.net/gogokongyin/article/details/51287985
21 、 http 协议与 TCP 联系
1.TCP协议对应于传输层,而HTTP协议对应于应用层
2.TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
3.TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP
22 、 http1.0 和 http1.1的区别
- HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).
2.在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
3.100(Continue) Status(节约带宽)
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);
4.HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)
https://www.cnblogs.com/heluan/p/8620312.html
23 、 http 的请求方法有哪些? get 和 post 的区别?
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
24 、 http 的状态码
下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
https://www.runoob.com/http/http-status-codes.html
25 、 http 和 https 的区别,由 http 升级为 https 需要做哪些操作
HTTPS的全称是Secure Hypertext Transfer Protocol(安全超文本传输协议),是在http协议基础上增加了使用SSL加密传送信息的协议
HTTPS和HTTP的区别:
1.https协议需要到ca申请证书,一般免费证书很少,需要交费。
2.http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
http 升级为 https:
一、购买申请SSL证书
二、通过nginx配置SSL证书
三、将以前的http请求重定向到https
26 、 https 的具体实现,怎么确保安全性
https://blog.csdn.net/wx_962464/article/details/51043069
27 、 http 中浏览器一个 URL 的流程,这个过程中浏览器做了什么, URL 包括哪三个部分?
URL包括:服务类型,主机名,路径及文件名
1.浏览器首先通过查找内部DNS缓存,查不到依次进行系统DNS缓存,路由器缓存,DNS服务器,一步一步找到并解析IP地址。
2.给对应IP地址的服务器发送搞一个http的请求。
3.百度服务器响应请求,发送html的文档
4.浏览器响应接收到的html的文档对象,解析,并显示。
28 、一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
linux socket使用16bit无符号整型表示端口号,最大到65535,不能改变,规定了是16bit二进制数,但是可以复用,即使用同一个端口号来进行通信
29 、对称密码和非对称密码体系
- 对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
常见的对称加密算法:DES,AES,3DES等等。
- 非对称加密
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
常见的非对称加密算法:RSA,ECC
- 区别
对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.
https://blog.csdn.net/zam183/article/details/85270472
30 、数字证书的了解(高频)
数字证书是经过权威机构(CA)认证的公钥,通过查看数字证书,可以知道该证书是由那家权威机构签发的,证书使用人的信息,使用人的公钥。它有以下特点:
1、由专门的机构签发的数字证书才安全有效。
2、签发数字证书是收费的。
3、不会被冒充,安全可信。
4、数字证书有使用期限,过了使用期限,证书变为不可用。CA也可以在试用期内,对证书进行作废操作。
31 、客户端为什么信任第三方证书
第三方认证机构,是指具有可靠的执行认证制度的必要能力,并在认证过程中能够客观、公正、独立地从事认证活动的机构。即认证机构是独立于制造厂、销售商和使用者(消费者)的、具有独立的法人资格的第三方机构,故称认证为第三方认证认证机构。
32 、TCP/IP 的分片粘包过程
1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。
2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲buffer,然后由缓冲buffer最后刷到数据链路层的,那么就有可能把数据包2的一部分数据结合数据包1的全部被一起发送出去了,这样在服务器端就有可能出现这样的情况,导致读取的数据包包含了数据包2的一部分数据,这就产生粘包,当然也有可能把数据包1和数据包2全部读取出来。
3.分包情况:意思就是把数据包2或者数据包1都有可能被分开一部分发送出去,接着发另外的部分,在服务器端有可能一次读取操作只读到一个完整数据包的一部分。
4.在数据包发送的情况下,有可能后面的数据包分开成2个或者多个,但是最前面的部分包,黏住在前面的一个完整或者部分包的后面,也就是粘包和分包同时产生了。
https://blog.csdn.net/qq513036862/article/details/53640317
33 、一个 IP 配置多个域名,靠什么识别?
靠http中的host段来完成,服务器根据host将请求转发到指定的主机上。
34 、服务器攻击( DDos 攻击)
分布式拒绝服务攻击,强调是将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。大量恶意的流量去访问同一个服务器,导致服务器处理不过来,功能瘫痪。