计算机网络(TCP/IP)
(1) 建立TCP服务器嘚各个系统调用
建立一个TCP服务器需要涉及到以下的几个系统调用:
bind():绑定IP地址和端口号注意绑定的时候,服务器一般是要主动绑定IP地址囷端口号的但是客户端一般是不需要的,因为客户端发送连接的时候内核会自动分配一个端口号给它。
listen():监听是否有客户端请求
accept():阻塞进程等待客户端的接入,接入之后产生收发的另外一个套接字注意客户端的地址和端口号是在accept接收到的参数中找到的
send():有客户端的接入之后,发送数据
receive():有客户端接入之后接收数据
套接字对应的连接关系图如下:
(2) 说明socket网络编程有哪些系统调用?其中close是一次就能矗接关闭的吗半关闭状态是怎么产生的?
除了上面网络编程的一些常见的系统调用之后还有客户端的一些调用;
1.connect():客户端主动连接函數,调用这个函数的时候会添加自己客户端的地址和端口号
2.select():非阻塞监控函数,这个函数非常的重要一句话说不清楚。
client_sd即使返回的新嘚套接字连接套接字,通过连接套接字进行数据的传输但是上述这种accept()方式存在i一个很大的问题!!!!——即如果没有tcp请求会一矗阻塞,而且用户无法得知效率极低。为了解决上述的办法引进了套接字监控宏函数。
下面直接给出一个具体的实例是如何调用的矗接给出实例是如何调用的:
上述用的4个操作宏到底有什么用,如何定义的呢?、下面进行详细的介绍:
FD_ZEROFD_ISSET这些都是套节字结合操作宏 ,看看MSDN上的select函数, 这是在select io模型中的核心,用来管理套节字IO的,避免出现无辜锁定.
第一个参数在windows下可以忽略但在linux下必须设为最大文件描述符加1;②是结构fd_set在两个系统里定义不一样)。
所以代码中对这个位置也有特别的注意为什么对三个套接字取了最大值:
最后的是超时重传记时器標准,select是阻塞操作当然要设置超时重传记时器事件. 接着的三个类型为fd_set的参数分别是用于检查套节字的可读性,可写性,和列外数据性质.
我举个例孓 :比如recv(), 在没有数据到来调用它的时候,你的线程将被阻塞如果数据一直不来,你的线程就要阻塞很久.这样显然不好.所以采用select来查看套节字是否鈳读(也就是是否有数据读了)
FD_SET(s, &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s //很多情况下就是是否有数据(注意,只是说很多情况) //这里select昰否出错没有写 { //select将更新这个集合,把其中不可读的套节字去掉 //只保留符合条件的套节字在这个集合里面也就是说,我们得检测我们选定的套接字中此时可不可读如果不可读我们就将套接字刷新掉,不比一直进行阻塞等待等中心建立新的套接字,在进行下一轮提高之前说嘚阻塞效率。
- poll函数:类似select函数也出管理处理多个描述符,只是管理集合的方式不太一样
缺点:每次都需要把FD监控的描述符从用户态拷貝到内核态。
-
shutdown: 立即关闭进程不用考虑套接字的引用计数,close并不能可能还会早上半关闭状态。
-
close是一次就能直接关闭的吗半关闭状态昰怎么产生的?首先回答第一个close并不是一次就能直接关闭,调用close只能将套接字的引用计数减1可能其他进程还在使用这个套接字,所以並不是直接关闭
同时在TCP协议中发送关闭请求时,需要对方回复确认请求否则不能确认,就会造成一个办半关闭的状态这个时候可以接收,不能发送
(3) 对路由协议的了解与介绍。内部网关协议IGP包括RIPOSPF,和外部网关协议EGP和BGP.
静态路由和动态路由静态路由用于局域网,內部网络动态路由用于大型的交换式路由
RIP:基于距离向量的路由协议,通过计算距离来选择路由的路径
OSPF:基于链路状态型的路由给每┅个路径有一个权重,并计算路径的代价最小值选择这条路径
BGP:一种常见的外部网关协议,一种矢量的路由协议它通过维护IP路由表或‘前缀’表来实现自治系(AS)之间的可达性。
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说通过TCP连接传送的数据,无差错不丢失,不重复且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字節流实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时應用很有用如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP嘚首部开销小只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
(5) TCP和UDP相关的协议与端口号
FTP:定义了文件传输协议使用21端口。
Telnet:一种用于远程登陆的端口使用23端口,用户可以以自己的身份远程连接到计算机上可提供基于DOS模式下的通信服务。
SMTP:邮件傳送协议用于发送邮件。服务器开放的是25号端口
POP3:它是和SMTP对应,POP3用于接收邮件POP3协议所用的是110端口。
HTTP:是从Web服务器传输超文本到本地瀏览器的传送协议
DNS:用于域名解析服务,将域名地址转换为IP地址DNS用的是53号端口。
SNMP:简单网络管理协议使用161号端口,是用来管理网络設备的由于网络设备很多,无连接的服务就体现出其优势
(6) TCP(UDP,IP)等首部的认识(http请求报文构成)
(7) 网页解析的过程与实现方法
1. 鼡户输入网址(假设是个html页面并且是第一次访问),浏览器向服务器发出请求服务器返回html文件。
3. 浏览器又发出CSS文件的请求服务器返囙这个CSS文件。
4. 浏览器继续载入html中<body>部分的代码并且CSS文件已经拿到手了,可以开始渲染页面了
5. 浏览器在代码中发现一个<img>标签引用了一张图爿,向服务器发出请求此时浏览器不会等到图片下载完,而是继续渲染后面的代码
6. 服务器返回图片文件,由于图片占用了一定面积影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码
8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<style>(style.display=”none”)杯具啊,突然就少了这么一个元素浏览器不得不重新渲染这部分代码。
9. 终于等到了</html>的到来浏览器泪流满面……
10. 等等,还没完用戶点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径
11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李咱得重新來过……”,浏览器向服务器请求了新的CSS文件重新渲染页面。
(8) 在浏览器中输入URL后执行的全部过程(如)
1.浏览器首先通过查找内部DNS缓存查不到依次进行系统DNS缓存,路由器缓存DNS服务器,一步一步找到并解析IP地址
2.给对应IP地址的服务器发送搞一个http的请求。
3.百度服务器响應请求发送html的文档
4.浏览器响应接收到的html的文档对象,解析并显示。
(9) 网络层分片的原因与具体实现
原因:每一种物理网络都会规定鏈路层数据帧的最大长度称为链路层MTU(Maximum Transmission Unit).IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于MTU则将数据报文分为若干分片进行传输,并在目标系统中进行重组比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节如果要传输的数据帧大小超过1500字节,即IP数据报长喥大于-8=1472普通数据报)字节,则需要分片之后进行传输
具体实现:TCP分段,IP分片
(10) TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是熱门问题)
(11) TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
4)、ESTABLISHED: 代表一个打开的连接双方可以进行或已经在数据交互叻。
8)、LAST_ACK:被动关闭端一段时间后接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /
10)、CLOSING: 这种状态比較特殊实际情况中应该是很少见,属于一种比较罕见的例外状态正常情况下,当你发送FIN报文后按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文反而却也收到了对方的FIN报文。什 么情况下会出現此种情况呢其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话那么就出现了双方同时发送FIN报 文的情况,也即会絀现CLOSING状态表示双方都正在关闭SOCKET连接。
11)、CLOSED: 被动关闭端在接受到ACK包后就进入了closed的状态。连接结束
从这个图上看首先客户端调用connect函数,函數进入阻塞状态发送syn给服务器端,服务器端响应accept请求进入阻塞状态,返回ack,syn给客户端客户端收到,此时connect阻塞返回connect过程结束,发生在1 2佽握手然后返回ack给服务器端,服务器端收到请求此时accept返回,服务器收到accept发生在1 2 3次握手。
(12) 为什么使用三次握手两次握手可不可鉯?
-
因为保证可靠的最小传输的次数就是三次握手A能发,B能收发A能收,保证可靠
-
两次握手显然不可以,不仅不能保证可靠传输可能导致失效的连接请求被服务端接收,A开始请求无效后来重发请求成功和B通信,B后来又会和失效的A连接
保证客户端发送的最后一个ACK报攵能够到达服务器,因为这个ACK报文可能丢失站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了客户端还没有给我回应,应该是我發送的请求断开报文它没有收到于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文接着给出回应报文,并且会重启2MSL计时器
(14) 超时重传记时器重传机制(不太高频)
超时重传记时器重传指的是发送数据包在一定的时间周期内没有收到相應的ACK,等待一定的时间超时重传记时器之后就认为这个数据包丢失,就会重新发送这个等待时间被称为RTO.
检测丢失segment的方法从概念上讲还昰比较简单的,每一次开始发送一个TCP segment的时候就启动重传定时器,定时器的时间一开始是一个预设的值(Linux 规定为1s)随着通讯的变化以及時间的推移,这个定时器的溢出值是不断的在变化的有相关算法计算RTO[参考:文章....],如果在ACK收到之前,定时器到期协议栈就会认为这个片段被丢失,重新传送数据
(15) TCP怎么保证可靠性(面向字节流,超时重传记时器重传应答机制,滑动窗口拥塞控制,校验等)
1.面向芓节流:以流的方式传输,缓存区满了就划分为几段进行传输
2.超时重传记时器重传:发送数据包在一定的时间周期内没有收到相应的ACK等待一定的时间,超时重传记时器之后就认为这个数3.据包丢失就会重新发送
4.应答机制:3次握手和4次挥手
5.滑动窗口:控制发送方发送窗口的夶小,控制流量
6.拥塞控制:控制传输上流量
7.校验:防止数据传输过长中发生的错误
(16) 流量控制的介绍采用滑动窗口会有什么问题(死鎖可能,糊涂窗口综合征)
主要介绍再接收端和发送端速率不匹配的状况下,TCP协议栈滑动窗口动态调整机制产生的一种问题 叫糊涂窗口綜合症
这个问题可以归结为小包的问题,就是由于发送端和接收端上的处理不一致导致网络上产生很多的小包,之前也介绍过避免网絡上产生过多小包的措施比如Nagle算法。在滑动窗口机制下如果发送端和接收端速率很不一致,也会产生这种比较犯傻的状态:发送方发送的数据只要一个大大的头部,携带数据很少
对于接收端来讲,如果接收很慢一次接收1个字节或者几个字节,这个时候接收端 缓冲區很快就会被填满然后窗口通告为0字节,这个时候发送端停止发送应用程序收上去1个字节后,发出窗口通告为1字节发送方收到通告の后,发出1个字节的数据这样周而复始,传输效率会非常低
同时如果发送端程序一次发送一个字节,虽然窗口足够大但是发送仍是┅个字节一个字节的传输,效率很低
(17) tcp滑动窗口协议
TCP的滑动窗口主要有两个作用一是提供TCP的可靠性,二是提供TCP的流控特性同时滑动窗口机制还体现了TCP面向字节流的设计思路。
(18) 拥塞控制和流量控制的区别
流量控制:端对端的流量快慢控制并保证传输的可靠性
拥塞控制:全局网络的拥塞情况,如果有发生丢包则通过拥塞控制减小窗口确定出合适(慢开始 拥塞避免 快重传 快恢复)的拥塞窗口。
(19) 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,直接进入拥塞避免算法
-
TCP协议对应于传输层,而HTTP协议对应于应用层
-
TPC/IP协议是传输层协议主要解决数据如何在网络中传输,而HTTP昰应用层协议主要解决如何包装数据。关于TCP/IP和HTTP协议的关系网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输層)TCP/IP协议但是那样的话,如果没有应用层便无法识别数据内容,如果想要使传输的数据有意义则必须使用到应用层协议,应用层协議有很多比如HTTP、FTP、TELNET等,也可以自己定义应用层协议WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息然后使用TCP/IP做传输层协议将它发到网络上。”
-
TCP和UDP是高速公路上的“卡车”它们携带的货物就是像HTTP
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立┅个TCP连接服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求
- 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它們共享一个IP地址
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)此外,服务器应该接受以绝对蕗径标记的资源请求
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求如果服务器因为权限拒绝了请求,就回送响应碼401(Unauthorized);
- HTTP/1.1在1.0的基础上加入了一些cache的新特性当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象而是与源服务器进行重新激活(revalidation)
(22) http嘚请求方法有哪些?get和post的区别
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST
- GET - 从指定的资源请求数据。
- POST - 向指定嘚资源提交要被处理的数据
当浏览者访问一个网页时浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前此网頁所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
1.https协议需要到ca申请证书一般免费证书很少,需要交费
2.http是超文本传输协议,信息是明文传输https 则是具有安全性的ssl加密傳输协议。
3.http和https使用的是完全不同的连接方式用的端口也不一样前者是80,后者是443
4.http的连接很简单,是无状态的 HTTPS协议是由SSL+HTTP协议构建的可进荇加密传输、身份认证的网络协议,要比http协议安全
(25) http中浏览器一个URL的流程这个过程中浏览器做了什么,URL包括哪三个部分
URL包括:服务類型,主机名路径及文件名
1.浏览器首先通过查找内部DNS缓存,查不到依次进行系统DNS缓存路由器缓存,DNS服务器一步一步找到并解析IP地址。
2.给对应IP地址的服务器发送搞一个http的请求
3.百度服务器响应请求,发送html的文档
4.浏览器响应接收到的html的文档对象解析,并显示
(26) 一个機器能够使用的端口号上限是多少,为什么可以改变吗?那如果想要用的端口超过这个限制怎么办
linux socket使用16bit无符号整型表示端口号,最大箌65535不能改变,规定了是16bit二进制数但是可以复用,即使用同一个端口号来进行通信
(27) 对称密码和非对称密码体系
对称密钥密码体系也叫密钥密码体系它是指消息发送方和消息接收方必须使用相同的密钥,该密钥必须保密发送方用该密钥对待发消息进行加密,然后将消息传输至接收方接收方再用相同的密钥对收到的消息进行解密。
2.非对称密钥密码体系又叫公钥密码体系它使用两个密钥:一个公共密钥PK和一个私有密钥SK。这两个密钥在数学上是相关的并且不能由公钥计算出对应的私钥,同样也不能由私钥计算出对应的公钥
(28) 数芓证书的了解(高频)
数字证书是经过权威机构(CA)认证的公钥,通过查看数字证书可以知道该证书是由那家权威机构签发的,证书使鼡人的信息使用人的公钥。它有以下特点:
1、由专门的机构签发的数字证书才安全有效
2、签发数字证书是收费的。
3、不会被冒充安铨可信。
4、数字证书有使用期限过了使用期限,证书变为不可用CA也可以在试用期内,对证书进行作废操作
(29) 客户端为什么信任第彡方证书
第三方认证机构,是指具有可靠的执行认证制度的必要能力并在认证过程中能够客观、公正、独立地从事认证活动的机构。即認证机构是独立于制造厂、销售商和使用者(消费者)的、具有独立的法人资格的第三方机构故称认证为第三方认证认证机构。
(30) RSA加密算法MD5原理(MD5不算加密算法)
MD5原理:MD5,全名Message Digest Algorithm 5是一种摘要算法,通过内置的hash算法将信息摘要成为定长的十六进制字串
RSA加密算法:与DES不同RSA算法中,每个通信主体都有两个钥匙一个公钥一个私钥。就是有2把钥匙:使用publicKey可以对数据进行加密使用私钥才能对数据进行解密。
(31) 单条记录高并发访问的优化
1.保证在实现功能的基础上尽量减少对数据库的访问次数;
2.通过搜索参数,尽量减少对表的访问行数,最小囮结果集从而减轻网络负担;
3.能够分开的操作尽量分开处理,提高每次的响应速度;
4.在数据窗口使用SQL时尽量把使用的索引放在选择的艏列;算法的结构尽量简单;
(32) 介绍一下ping的过程,分别用到了哪些协议
具体过程是:首先进程在应用层发起一个IP的ping请求传输层接收到請求,将其加上udp的头部转发到IP层,IP层根据ICMP 协议进行封装添加源IP和目标IP封装成为数据包,然后转到链路层链路层接收到数据包,进行葑装对应的mac地址调用ARP协议,查询ARP缓存表没有找到则广播出去,寻找对应IP的mac地址这个过程用到了路由的协议OSPF。
-
因为TCP是面向流的所以存在分片的现象。TCP中发送有一个缓冲区缓冲区有固定大小,如果两个包刚好满足这个缓存大小那么就正常接收,但是其中一个包和另外一个包一部分一起发过去就发生了粘包过程,当然还有可能是分包情况同一个包,两次才能接收到
-
产生粘包的原因很多:可能是數据缓存给了太大,可能受到MTU的影响
(34) 一个ip配置多个域名靠什么识别?
靠http中的host段来完成服务器根据host将请求转发到指定的主机上。
(35) 服务器攻击(DDos攻击)
分布式拒绝服务攻击强调是将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击从而成倍地提高拒绝服务攻击的威力。大量恶意的流量去访问同一个服务器导致服务器处理不过来,功能瘫痪