参考资料:
https://my.oschina.net/yangjiannr/blog/1528516
http://www.cnblogs.com/zyf-zhaoyafei/p/4716297.html
这篇文章总结一下计算机网络常见的面试问题和复习的要点。由于我不是后台方向的,所以这些内容都是比较基础的,个人对 socket 的使用也仅仅局限于一些基本操作。计算机网络的复习主要集中在以下几个模块:
1. 纲要: OSI七层模型, TCP/IP四层模型,五层模型以及每一层的协议,用处。下面分层提问
1.1 各种协议的概述
2. 应用层
2.1 HTTP 1.0与HTTP1.1的区别,HTTPS与HTTP的区别
2.2 简述HTTP中GET和POST的区别
2.3 各种应用层协议分别基于什么socket TCP or UDP
2.4 DNS域名解析,简述其工作原理
2.5 HTTP 协议中, cookie, session的概念与区别
2.6 HTTP 状态码,常见的有什么意义?
2.7 HTTP 请求的8种方法?
2.8 HTTP 报文的结构 ?
2.9 从浏览器中输入地址,回车后发生了什么,涉及到哪些协议 ?
2.10 * 如何设计一个应用层协议 ?需要注意哪些问题?
3. 传输层
3.1 什么是全双工,什么是半双工?TCP的传输链路是什么?
3.2 TCP,UDP 的概念,区别, 报头的格式 ?
3.3 TCP socket 建立的三次握手,断开的四次挥手,每一步都发哪些报文?
3.3.1 为什么连接的时候是三次握手,不是两次呢?即为什么要让服务端处于半连接状态?
3.3.2 关闭的时候却是四次握手?
3.3.3 关闭时为什么TIME_WAIT状态需要经过2MSL(两倍最大报文段生存时间)才能返回到CLOSE状态?为什么不直接CLOSE?
3.3.4 tcp协议的缓冲区什么情况下应该设置的大一些,什么时候应该小一些
3.3.5 阻塞与非阻塞t的区别?
3.3.6 Linux IO多路复用的四种方式?poll, epoll, select, pselect
3.3.7 * DDOS 攻击(SYN报文攻击)
3.4 TCP 的流量控制和拥塞控制机制
3.5 面向连接和非面向连接的服务的特点是什么?
3.6 什么情况下使用TCP,什么情况下使用UDP?不同类型的网络游戏用什么?你觉得LOL用的是TCP还是UDP?
3.7 socket 编程相关问题
4. 网络层
4.1 四类IP地址,子网划分的计算,特殊的IP段,保留地址
4.2 ARP是地址解析协议,简单语言解释一下工作原理
4.3 ping 操作的原理,涉及哪些协议?
5. 硬件上的一些问题
5.1 每一层涉及的硬件有哪些?分别是干什么用的?对应的协议是什么?
------------------------------------------------------ 我是分割线 ------------------------------------------------------
注: 打 * 的了解一下就可以了,用来吹吹牛逼
一、纲要: OSI七层模型, TCP/IP四层模型,五层模型以及每一层的协议,用处。
1. 进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开一个端口为20来进行传输数据文件。
2. DNS 协议同时基于TCP和UDP,当报文较大时用TCP,否则用UDP。DNS 基于ICMP协议,所以不使用端口。
3. DHCP 动态主机配置协议,有两个作用,给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。UDP 67端口和UDP 68端口分别为DHCP协议的server和client服务端口。
4. TFTP是一个传输文件的简单协议,它基于UDP协议而实现。此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。
图1.2 不同层协议之间的沟通
1.1 各种协议的概述
- ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
- TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
- HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
- DHCP协议: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。
- NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,
- DHCP协议:一个局域网的网络协议,使用UDP协议工作,用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段
- FTP:定义了文件传输协议,使用21端口进行身份确认,然后用20端口传数据。
- Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
- SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
- POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
- HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。 UDP对应的协议:
- DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
- SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
二、应用层
2.1 HTTP 1.0与HTTP1.1的区别,HTTPS与HTTP的区别
2.2 简述HTTP中GET和POST的区别
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
2.3 各种应用层协议分别基于什么socket TCP or UDP, 端口?
基于TCP的有:
- HTTP 80
- FTP 21, 20
- SSH 22
- Telnet 23
- SMTP 25
- POP3 110
- DHCP 67, 68
- TFTP 69
- DNS
2.4 DNS域名解析,简述其工作原理
2.5 HTTP 协议中, cookie, session的概念与区别
2. Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。 Cookie的使用很普遍,许多提供个人化服务的网站,都是利用Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是Web接口的免费E-mail网站,都要用到 Cookie
什么是session ?
1. Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
2. 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
3. 如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
两者的区别?
1. Session是存在服务器端的;而Cookie是存在客户端的!!
2. Session更不需要Cookie来支持和不会受浏览器端的设置影响,可记录每个访问者的信息,独立在服务器端,比Cookie安全!
3. Session是存在内存中的,浏览器关闭它也就“死”了;Cookie是以文件方式存在的,可以修改其“存活”时间。
2.6 HTTP 状态码,常见的有什么意义?
状态行格式如下: HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
- 200 OK //客户端请求成功
- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden //服务器收到请求,但是拒绝提供服务
- 404 Not Found //请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error //服务器发生不可预期的错误
- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常 eg:HTTP/1.1 200 OK (CRLF)
2.9 HTTP 请求的8种方法
请求方法 | 意义 |
---|---|
GET | 请求获取Request-URI所标识的资源 |
POST | 在Request-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URI所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用Request-URI作为其标识 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
2.8 HTTP 报文的结构?
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。 第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息 第2~4行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
2.9 从浏览器中输入地址,回车后发生了什么,涉及到哪些协议 ?
- 解析URL
- DNS查询,解析域名,将域名解析为IP地址。过程为 浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP DNS缓存 -> 根域名服务器 (注:ISP, Internet Service Provider,互联网服务提供商,就是那些拉网线到你家里的运营商,中国电信中国移动什么的)
- ARP广播,根据IP地址来解析MAC地址
- 分别从应用层到传输层、网络层和数据链路层分别加入各个层的头部封装为包
- 进行三次握手后,客户端与服务器建立连接
- 客服务器向客户端返回数据,浏览器接收到数据
- 浏览器开始渲染页面
涉及的协议有:
- 应用层:HTTP, DNS
- 传输层:TCP,UDP
- 网络层:IP, ICMP, ARP
- 链路层:Ethernet
2.10 * 如何设计一个应用层协议 ?需要注意哪些问题?
参考资料:http://blog.csdn.net/smstong/article/details/49148283
应用层协议的设计需要考虑的问题有:
- 不同平台对浮点数、字节序的处理不同
- struct \ class的字节对齐不同编译器的实现不同,可能需要强制指定对齐方式如#pragme pack(4),强制四字节对齐
- 网络字节序和本地字节序的匹配问题
- 不同平台的位数不同,整型和实型的表示范围不同
- 字节流,将要传送的信息定义为一个byte buffer,规定第几字节代表什么信息,传送的大小是所有字节的长度和。
- 文本流,将要传送的信息格式化为字符串,以文本的方式,将内容放入 buffer传递,接收方解析收到的文本字符串,从中提取信息
- 字节流实现更加简单,接收方和发送方只要提取字节流的特定字节就可以获得消息,缺点是不同平台、不同编译器对数据的实现不同,比如有的机器浮点型是1+8+23,有的机器是1+4+11,直接提取是不行的。而且还要考虑字节序的问题,不同机器的字节序也会有差别。所以此实现很难跨平台
- 文本流实现可以跨平台,因为字符是完全跨平台的,它的信息并不直接和数据的表示方式有关,而是和字节顺序有关(即字符串)。接收方需要解析读取的字符串,比如把字符串“{20.0}”解析为实型20.0,如何解析,解析的精确程度可以根据平台的限制有所取舍。此实现的确定是比较复杂,需要花大量时间来解析文本而不能直接从字节流中拷贝到内存。
三、传输层
3.1 什么是全双工,什么是半双工?TCP的传输链路是什么?
全双工(Full Duplex)是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。
半双工(Half Duplex),所谓半双工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是基于半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台.
单工通信是指通信线路上的数据按单一方向传送.
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
3.2 TCP,UDP 的概念,区别, 报头的格式 ?
- TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
- TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。
- TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。
- TCP保证数据正确性,UDP可能丢包
- TCP保证数据顺序,UDP不保证
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
- UDP报文的最大长度为 2^32-1=65535; TCP 报文大小没有限制(暂不考虑缓冲区的大小),如果一次发过去太长,会分段发送,然后拼接,如果比较短,也可能会等到和下一个一起发;整个TCP包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传
输的最大数据分段,然后接收方把这些片段拼接起来得到完整的数据段。
大部分情况下都是用TCP,UDP适用情况如下:
- 面向数据报方式
- 网络数据大多为短消息
- 拥有大量Client (现在有了epoll,TCP问题也不大)
- 对数据安全性无特殊要求
- 网络负担非常重,但对响应速度要求高
具体编程时的差别:
- socket()的参数不同
- UDP Server不需要调用listen和accept
- UDP收发数据用sendto/recvfrom函数
- TCP:地址信息在connect/accept时确定
- UDP:在sendto/recvfrom函数中每次均 需指定地址信息
- UDP:shutdown函数无效
3.2.1 TCP 报文头部
TCP报文的头部最小为20字节,
注:
1. TCP 报文头部中有6个用来说明报文类型的位,默认为 0 , 当被置为1时,说明此报文为对应类型。
- URG 紧急位,对应紧急报文
- ACK 确认位,对应确认报文
- PSH 推搡位,对应推送报文
- RST 复位位,对应复位报文
- SYN 同步位,对应同步报文
- FIN 终止位,对应终止报文
4. 窗口包含接收窗口(流量控制)、发送窗口、拥塞窗口(拥塞控制)
5. 只有ACK=1,ack确认号才有意义
3.2.2 UDP 报文头部
注:
1. UDP 头部中的长度决定了数据部分的长度,所以UDP数据报整个(含头部和IP报文头部)的最大长度为 2^16-1=65535,数据内容的最大长度为 65535- IP头(20) - UDP头(8)=65507 Bytes,在socket编程中,用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。
3.3 TCP socket 建立的三次握手,断开的四次挥手,每一步都发哪些报文?
图 3.1 TCP连接建立的三次握手
图3.2 TCP连接释放的四次挥手
标志位缩写 | 全称 | 中文 |
---|---|---|
SYN | synchronous | 建立联机 |
ACK | acknowledgement | 确认 |
PSH | push | 传送 |
FIN | finish | 结束 |
RST | reset | 重置 |
URG | urgent | 紧急 |
Seq | Sequence number | 顺序号码 |
ACK | Acknowledge number | 确认号码 |
状态名称 | 意义 |
---|---|
LISTEN | 侦听来自远方TCP端口的连接请求 |
SYN-SENT | 在发送连接请求后等待匹配的连接请求 |
SYN-RECEIVED | 在收到和发送一个连接请求后等待对连接请求的确认 |
ESTABLISHED | 代表一个打开的连接,数据可以传送给用户 |
FIN-WAIT-1 | 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 |
FIN-WAIT-2 | 从远程TCP等待连接中断请求 |
CLOSE-WAIT | 等待从本地用户发来的连接中断请求 |
CLOSING | 等待远程TCP对连接中断的确认 |
LAST-ACK | 等待原来发向远程TCP的连接中断请求的确认 |
TIME-WAIT | 等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
CLOSED | 没有任何连接状态 |
3.3.1 为什么连接的时候是三次握手,不是两次呢?即为什么要让服务端处于半连接状态?
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据,B的许多资源就这样白白浪费了。
3.3.2 关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,乙方也未必全部数据都发送给对方了,所以乙方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,乙方ACK和FIN一般都会分开发送。
3.3.3 关闭时为什么TIME_WAIT状态需要经过2MSL(两倍最大报文段生存时间)才能返回到CLOSE状态?为什么不直接CLOSE?
1.保证TCP协议的全双工连接能够可靠关闭
如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
2.保证这次连接的重复数据段从网络中消失
如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
3.3.4 tcp协议的缓冲区什么情况下应该设置的大一些,什么时候应该小一些
- IPv4 数据报最大大小是65535(16位),包括IPv4头部。
- IPv6 数据报最大大小是65575,包括40个字节的IPv4头部
- MTU, 这是由硬件规定的,如以太网的MTU是1500字节,IPv4要求最小MTU是68字节,IPv6要求最小MTU是576字节
- path MTU: 指两台主机间的路径上最小MTU
- 分片(fragmentation): 指ip数据报大小超过相应链路的MTU,IPv4和IPv6都将对ip数据进行分片,到达目的主机后进行重组。
- IPv4头部的DF位用于设置分片还是不分片
- MSS:最大分节大小,向对方TCP通告被通告方在每个分节中能发送的最大TCP数据量。MSS的目的是告诉对方其重组缓冲区大小的实际值,从而避免分片。
每个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write往套接口写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的发送缓冲区中有别的数据,应用进程将被挂起。内核将不从write返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。所以,从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。
TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。
UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个发送缓冲区。
写UDP套接口的write返回表示应用程序的数据或数据分片已经进入链路层的输出队列,如果输出队列没有足够的空间存放数据,将返回错误ENOBUFS.
3.3.5 阻塞与非阻塞的区别?阻塞模式会有什么后果?
- read()/write()
- recv()/send() TCP
- readv()/writev()
- recvmsg()/sendmsg()
- recvfrom()/sendto() UDP
问题一:概念
非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。
问题二:阻塞模式的问题
非阻塞套接字,IO会马上返回.但在send时,如果SOCKET缓冲区已满,会返回错误,使用WSAGetLastError会得到错误码为WSAEWOULDBLOCK,意思是说在一个非阻塞的套接字上,请求没有完成。recv时如果SOCKET缓冲区没有可以读的数据,也会返回WSAEWOULDBLOCK.
问题三:什么时候选什么模式?
问题四:同步、异步和阻塞、非阻塞的关系
问题五:非阻塞读写的写法
if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示没有读到数据
}
else return -1; //表示读取失败
}
else return nread;读到数据长度
int write_pos = 0;
int nLeft = nLen;
while (nLeft > 0)
{
int nWrite = 0;
if ((nWrite = write(sock_fd, data + write_pos, nLeft)) <= 0)
{
if (errno == EWOULDBLOCK)
{
nWrite = 0;
}else return -1; //表示写失败
}
nLeft -= nWrite;
write_pos += nWrite;
}
return nLen;
3.3.6 Linux的IO多路复用的四种方式: poll, epoll, select,pselect
3.3.7 DDOS 攻击(SYN报文攻击)
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。
SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了
3.4 TCP 的流量控制和拥塞控制机制
接收端缓冲区大小。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。
(2) 拥塞窗口 cwnd (congestion window)
发送端缓冲区大小
(3) 发送窗口swnd
发送窗口的上限值 = Min [rwnd, cwnd],综合考虑了流量控制和拥塞控制。
当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
(1)流量控制
![](http://up.2cto.com/2013/0923/20130923092130492.jpeg)
(2) 拥塞控制
拥塞控制主要包含以下2个内容:
- 慢开始(指数增大即*2),拥塞避免(加法增大)
- 快重传,快恢复
![](http://up.2cto.com/2013/0923/20130923092139371.jpeg)
(2) 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。如下图:
3.5 面向连接和非面向连接的服务的特点是什么?
面向连接的服务,通信双方在进行通信之前,要先在双方建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时地监控和管理。 非面向连接的服务,不需要预先建立一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往网络上发送信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。
3.6 什么情况下使用TCP,什么情况下使用UDP?不同类型的网络游戏用什么?你觉得LOL用的是TCP还是UDP?
- 简单直接的长连接
- 可靠的信息传输,保证不会丢包,保证数据的顺序
- 数据包的大小没有限制
- 延迟比较大。由于是可靠的,一旦丢包,会进行重传,
- 包体比较大,传输速率较慢
- 会进行拥塞控制且假定了这是由网络带宽不够造成,拥塞窗口会在拥塞时乘法减小,发包数量腰斩
- 包体较小,传输速率快
- 延迟小
- 无需建立连接
- 连接不可靠,会丢包
- 包的大小有限制 2^16 - 20 - 8.
- 可以容忍延迟并且有很好的屏蔽延迟的设计,如纸牌类和MMO,用TCP
- 实时游戏,不能容忍延迟,如DOTA类和动作类,用UDP
- 在多人网络游戏中,人物的移动可以用UDP来发。因为人物一直处于移动当中,会频繁发出位置信息的包。由于发的比较频繁,而且后面的位置信息会覆盖掉前面的位置信息,所以丢不丢包不重要。就可以用UDP来发。每个UDP包的数据里面加个时间戳,那么进来的包你判断下时间,如果是已经过期的包,就可以直接丢掉。这样,即使udp包过来的顺序不一样都无所谓了。
- 英雄联盟TCP和UDP都用
- 如果对于数据传输速度要求非常高的场景,比如FPS,MOBA等游戏过程中,用户对战时候的数据肯定是要用UDP来传输的,并且在程序层面保证传输的可靠性,包括自己做校验等;
- 但其它模块,比如大厅里啊,买东西啊,创建房间啊等等,都是可以TCP实现的
- LOL这种MOBA类的无法忍受延迟,且响应速度至关重要,必然会使用UDP
3.7 socket 编程相关问题
3.8 TCP socket如何判断连接的有效性?
四、网络层
4.1 四类IP地址,子网划分的计算,特殊的IP段,保留地址
4.2 ARP是地址解析协议,简单语言解释一下工作原理
2. 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。
3. 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4. 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。
4.3 ping 操作的原理,涉及哪些协议?
ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议,可靠性由ICMP协议解决。
假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?
首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表(由ARP)协议实现中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。
即先由IP地址,在网络层传输,然后再根据mac地址由数据链路层传送到目的主机。
涉及到的协议有:
- ICMP internet报文控制协议, 用于在IP主机、路由器之间传递控制消息。
- IP 协议
- ARP 协议
五、硬件上的一些问题
5.1 每一层涉及的硬件有哪些?分别是干什么用的?对应的协议是什么?
交换机,网关,路由的区别
- 交换机 在计算机网络系统中,交换机是针对共享工作模式的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条背 部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部 交换矩阵迅速将数据包传送到目的端口。目的MAC若不存在,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表 中。 交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张 ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不 能划分网络层广播,即广播域。 交换机被广泛应用于二层网络交换,俗称“二层交换机”。 交换机的种类有:二层交换机、三层交换机、四层交换机、七层交换机分别工作在OSI七层模型中的第二层、第三层、第四层盒第七层,并因此而得名。
- 路由器 路由器(Router)是一种计算机网络设备,提供了路由与转送两种重要机制,可以决定数据包从来源端到目的端所经过 的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转 送。路由工作在OSI模型的第三层——即网络层,例如网际协议。 路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。
- 网关 网关(Gateway),网关顾名思义就是连接两个网络的设备,区别于路由器(由于历史的原因,许多有关TCP/IP 的文献曾经把网络层使用的路由器(Router)称为网关,在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP),经常在家 庭中或者小型企业网络中使用,用于连接局域网和Internet。 网关也经常指把一种协议转成另一种协议的设备,比如语音网关。 在传统TCP/IP术语中,网络设备只分成两种,一种为网关(gateway),另一种为主机(host)。网关能在网络间转递数据包,但主机不能 转送数据包。在主机(又称终端系统,end system)中,数据包需经过TCP/IP四层协议处理,但是在网关(又称中介系 统,intermediate system)只需要到达网际层(Internet layer),决定路径之后就可以转送。在当时,网关 (gateway)与路由器(router)还没有区别。 在现代网络术语中,网关(gateway)与路由器(router)的定义不同。网关(gateway)能在不同协议间移动数据,而路由器(router)是在不同网络间移动数据,相当于传统所说的IP网关(IP gateway)。 网关是连接两个网络的设备,对于语音网关来说,他可以连接PSTN网络和以太网,这就相当于VOIP,把不同电话中的模拟信号通过网关而转换成数字信号,而且加入协议再去传输。在到了接收端的时候再通过网关还原成模拟的电话信号,最后才能在电话机上听到。 对于以太网中的网关只能转发三层以上数据包,这一点和路由是一样的。而不同的是网关中并没有路由表,他只能按照预先设定的不同网段来进行转发。网关最重要的一点就是端口映射,子网内用户在外网看来只是外网的IP地址对应着不同的端口,这样看来就会保护子网内的用户。