参考资料:
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四层模型,五层模型以及每一层的协议,用处。
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位数据。
5. FTP 协议中,21端口用来确认身份,然后20端口用来传数据。
图1.1 从应用层自定义数据包一路封装到链路层MAC帧
图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的区别
HTTP1.1中才有cache-control响应头,主要用于控制信息在浏览器的缓存
1. HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求 缺陷:访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性能
2. HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟 HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果 ,TTP 1.1还提供了Host、身份认证、状态管理和Cache缓存等机制相关的请求头和响应头
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
基于UDP的有
当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。基于UDP服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。
2.5 HTTP 协议中, cookie, session的概念与区别
什么是cookie?
1. Cookie是Web网站放在 您的硬盘上的程序。它守在您的电脑里,搜集您的信息以及您在因特网上所做的任何事情,当Web站点需要的时候它能够下载所有这些搜集到的信息。” 像这样的定义在报刊中相当普遍。问题是,它的定义犯了很大的错误。Cookie不是程序,而且它不能像程序一样地运行,所以它无法为自己搜集任何信息。它也不能从您的电脑上取得您的任何个人资料。
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,如何解析,解析的精确程度可以根据平台的限制有所取舍。此实现的确定是比较复杂,需要花大量时间来解析文本而不能直接从字节流中拷贝到内存。
几种糟糕的设计:
1. 消息格式“包头+数据+包尾”,如"{{t=12}}"。第二个结束符 }} 其实是多于的,因为两个报文之间只需要一个符号就可以区分,上述的方法会造成浪费 {{ 1 }} {{ 2 }} {{ 3 }} .. 其实只需要 {{1 {{ 2 {{ 3就可以区分了。格式应该是 消息1+边界+消息2+边界+消息3+边界+...
2. 用结构体代码描述消息结构。比如直接发一个结构的实例过去,
struct
{
char x;
int y ;
}
因为你不知道另一个接收方的数据二进制布局是什么样的,很可能和发送方的不同,直接发过去,肯定无法解析正确。而且,如果没有指定字节对齐方式和字节序,也会有问题。这是一种跨平台性很差的实现。应该在发送之前,把结构实例字节序列化为一个buffer。
3. 直接传送二进制浮点数。不同的机器对浮点数的实现可能会有差别,存放方式千差万别。要传送浮点数,有下面两种方式:
a. 文本化。也就是传送描述浮点数的字符串,我们知道字符串是完全跨平台的,尤其是在UTF-8这样全球统一字符编码的情况下。
b. 转换为整数。例如1.2,可以用整数12代替,只是要规定单位为0.1即可。
三、传输层
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 终止位,对应终止报文
2. 序号即 seq, 指自己发送序列的下一个字节在流中的编号
3. 确认序号即确认号 ack,指收到从对方接受过来的字节流,发回下一个字节的编号。
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收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新连接就建立了。
由于现在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协议的缓冲区什么情况下应该设置的大一些,什么时候应该小一些
本问题介绍一些影响IP数据报大小的限制,我们先介绍这些限制,然后就他们如何影响应用进程传递的数据综合分析
- 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与UDP的输出
每个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write往套接口写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的发送缓冲区中有别的数据,应用进程将被挂起。内核将不从write返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。所以,从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。
TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。
UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个发送缓冲区。
写UDP套接口的write返回表示应用程序的数据或数据分片已经进入链路层的输出队列,如果输出队列没有足够的空间存放数据,将返回错误ENOBUFS.
tcp协议的发送缓冲区什么情况下应该设置的大一些,什么时候应该小一些
3.3.5 阻塞与非阻塞的区别?阻塞模式会有什么后果?
套接字socket 有两种模式,即阻塞和非阻塞式,默认是阻塞的。注意两者都是同步IO,而非异步IO。异步IO是另一种IO方式,这类函数的工作机制是告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到用户空间)完成后通知我们。
可以阻塞或非阻塞的函数有:
- read()/write()
- recv()/send() TCP
- readv()/writev()
- recvmsg()/sendmsg()
- recvfrom()/sendto() UDP
阻塞或者非阻塞socket读写的写法参考 http://www.cnblogs.com/sunziying/p/6501045.html
知乎上有个答案说的挺好的(两列):
问题一:概念
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.
非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。
问题二:阻塞模式的问题
套接字在IO时阻塞应用程序,就是说控制权不会返回给应用程序,也就是说程序执行到此代码时会卡住。分两种情况,
1. send函数时,只有把要发送的数据下传至TCP层,send这句代码才继续向下执行,此时可确认自己的数据已经在网络上传输了
2. recv时,只有收到一定数据给应用程序缓冲区时,recv这行代码才会向下执行。如果不想这样做,可以使用多线程,或者选用其他网络IO模型。
一般在做服务器程序时,不会使用阻塞套接字,性能低,数据吞吐率也不高。优点是此种模型编写难度较低,可以用来做入门的学习之用。
非阻塞套接字,IO会马上返回.但在send时,如果SOCKET缓冲区已满,会返回错误,使用WSAGetLastError会得到错误码为WSAEWOULDBLOCK,意思是说在一个非阻塞的套接字上,请求没有完成。recv时如果SOCKET缓冲区没有可以读的数据,也会返回WSAEWOULDBLOCK.
问题三:什么时候选什么模式?
一般情况下,简单的客户端程序可以选择阻塞式socket,编程简单,使用稳定。其余情况大多是非阻塞的,因为非阻塞socket的性能高,数据吞吐率高。非阻塞模式编程通常需要一个while循环,因为每次发送和接受的长度(写入、读出内核缓冲区的长度,即send,recv的返回值)不一定是buf的大小,而阻塞式编程一定是等到都发送出去或者接受完才从send, recv返回,不需要while。 http://blog.csdn.net/bird67/article/details/8561414
问题四:同步、异步和阻塞、非阻塞的关系
知乎上有一个答案讲的很好 https://www.zhihu.com/question/19732473。
总的来说,同步、异步与阻塞、 非阻塞并没有直接对应关系,是两种不同的概念。
1. 同步与异步是关注 消息通信机制。同步是指发起一个 调用后,在得到结果之前,调用不返回 return,一直在调用处,但一旦 return,就得到了结果,此调用结束。异步是指还是发起一个 调用后,此调用直接返回,没有返回结果,当一个异步过程调用发出后,调用者不会立刻得到结果, 而是在*调用*发出后,* 被调用者*通过状态、通知来通知调用者,或通过 回调函数处理这个调用。
2. 阻塞和非阻塞关注的是 程序在等待调用结果(消息,返回值)时的状态。涉及到了线程的阻塞挂起。阻塞调用是指调用结果返回之前,当前线程会被 挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程,但是 调用者需要时不时的(定期的)查看是否有结果返回。
问题五:非阻塞读写的写法
非阻塞的read调用一般这样写:
if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示没有读到数据
}
else return -1; //表示读取失败
}
else return nread;读到数据长度
非阻塞的write操作一般写法是:
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的流量控制和拥塞控制涉及到三个窗口:
(1) 接收端窗口 rwnd
接收端缓冲区大小。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。
(2) 拥塞窗口 cwnd (congestion window)
发送端缓冲区大小
(3) 发送窗口swnd
发送窗口的上限值 = Min [rwnd, cwnd],综合考虑了流量控制和拥塞控制。
当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
(1)流量控制
问 为什么需要流量控制?
答 如果发送方发的太快,接收方可能会来不及接受,会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。还可发送 300 字节。下面的图解释了“滑动”的核心概念,即 发送窗口的滑动,发送窗口由接收方发来的确认报文中的rwnd接收窗口设置,发送方的发送窗口大小等于接收方的发接收窗口。发送方的发送窗口不能超过接收方的接收窗口的数值。
发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节。现在发送端最多还可发送 400 字节的数据。
下面是另一个例子说明利用滑动窗口机制进行流量控制:
设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。TCP连接建立时的窗口协商过程在图中没有显示出来。再设每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值ack。
从图中可以看出,B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1 ,只有在ACK=1时确认号字段才有意义。
TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。
(2) 拥塞控制
问:为什么需要拥塞控制
答:拥塞控制是防止过多数据注入网络中使得路由器、交换机等资源过载。由于带宽、交换机、CPU等网络资源有限,对这些资源的需求超过了资源可用数时,就会发生拥塞。
拥塞控制主要包含以下2个内容:
- 慢开始(指数增大即*2),拥塞避免(加法增大)
- 快重传,快恢复
涉及的窗口是 拥塞窗口 cwnd。有 发送方维护。发送方让自己的发送窗口swnd等于拥塞窗口cwnd,拥塞窗口的大小是动态变化的。四个算法都是相互关联,可以组合使用的。
2.1 慢开始和拥塞避免
基本思路是为了避免一次性注入太多数据进网络可能带来的拥塞问题,由于网络的负荷情况是无法得知的,直觉的解决思路是逐渐增加发送窗口(拥塞窗口),来试探网络的最大承载门限。慢开始和拥塞避免之间的拐点是慢开始门限,先执行慢开始算法,指数级增大拥塞窗口,达到慢开始门限值时,执行拥塞避免算法, 因为门限值以后很可能会发生拥塞,最好慢慢增加(加法增大)。
2.1.1 慢开始原理
(1)在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。
(2)在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值。
(3)用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
2.1.2 实例讲解
注:图中窗口的单位都是报文段
(1)当 TCP 连接进行初始化时:
发送窗口:swnd = 1
慢开始阈值(慢开始门限):ssthresh = 16
(2)发送端收到 ACK1 (确认 M0,期望收到 M1)后,将 cwnd 从 1 增大到 2,于是发送端可以接着发送 M1 和 M2 两个报文段(指数增长)
(3)接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1。现在发送端的 cwnd 从 2 增大到 4,并可发送 M4 ~ M6共 4个报文段。(指数增长)
(4)当swnd >= ssthresh,swnd执行拥塞避免算法,swnd窗口按线性规律增长。 (加法增大)
(5)当发送 超时,此时swnd = 24 :
ssthresh = swnd/2 = 12;(乘法减小)
swnd = 1
(6)重复地2步。
2.2 快重传和快恢复(两者配合使用)
2.2.1 快重传
接受方一旦发现一个包丢失,则连续发三个针对上一个收到的包的重复确认。发送端只要一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时, 减少了因数据报丢失带来的重传时间,提高网络的吞吐率。然后进行快恢复算法。
2.2.2 快恢复
(1) 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
(2) 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。如下图:
3.5 面向连接和非面向连接的服务的特点是什么?
面向连接的服务,通信双方在进行通信之前,要先在双方建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时地监控和管理。 非面向连接的服务,不需要预先建立一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往网络上发送信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。
3.6 什么情况下使用TCP,什么情况下使用UDP?不同类型的网络游戏用什么?你觉得LOL用的是TCP还是UDP?
TCP的优点在于
- 简单直接的长连接
- 可靠的信息传输,保证不会丢包,保证数据的顺序
- 数据包的大小没有限制
TCP的缺点是
- 延迟比较大。由于是可靠的,一旦丢包,会进行重传,
- 包体比较大,传输速率较慢
- 会进行拥塞控制且假定了这是由网络带宽不够造成,拥塞窗口会在拥塞时乘法减小,发包数量腰斩
UDP的优点在于
- 连接不可靠,会丢包
- 包的大小有限制 2^16 - 20 - 8.
如何选择TCP或者UDP?
- 可以容忍延迟并且有很好的屏蔽延迟的设计,如纸牌类和MMO,用TCP
- 实时游戏,不能容忍延迟,如DOTA类和动作类,用UDP
- 在多人网络游戏中,人物的移动可以用UDP来发。因为人物一直处于移动当中,会频繁发出位置信息的包。由于发的比较频繁,而且后面的位置信息会覆盖掉前面的位置信息,所以丢不丢包不重要。就可以用UDP来发。每个UDP包的数据里面加个时间戳,那么进来的包你判断下时间,如果是已经过期的包,就可以直接丢掉。这样,即使udp包过来的顺序不一样都无所谓了。
你觉得LOL用的是TCP还是UDP?
- 英雄联盟TCP和UDP都用
- 如果对于数据传输速度要求非常高的场景,比如FPS,MOBA等游戏过程中,用户对战时候的数据肯定是要用UDP来传输的,并且在程序层面保证传输的可靠性,包括自己做校验等;
- 但其它模块,比如大厅里啊,买东西啊,创建房间啊等等,都是可以TCP实现的
- LOL这种MOBA类的无法忍受延迟,且响应速度至关重要,必然会使用UDP
3.7 socket 编程相关问题
http://blog.csdn.net/wesleyluo/article/details/6149071
http://blog.csdn.net/bird67/article/details/8561414
可以看看我的C跨平台socket库是怎么写tcp_send和tcp_recv的,两个函数在阻塞或非阻塞模式下都可以准确发送和接收。 https://github.com/neonum/tekcos/blob/master/tekcos.c
要点:
1. TCP socket send() 并不把数据传到网络上,而只是吧数据从socket缓冲区的数据复制到内核的发送缓冲区。此时这些数据并不一定马上被传到连接的另一端。
2. setsockopt 和 getsockopt 分别用来设置socket的内部变量、选项。set socket option and get socket option.
3. tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.
4. send 和 recv只与内核的发送和输出缓冲区打交道,不和另一端打交道。数据在端到端的传送由内核完成。
3.8 TCP socket如何判断连接的有效性?
心跳包和心跳检测。网络中的接收和发送数据都是使用SOCKET进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字是否还可以使用呢?这个就需要在系统中创建心跳机制。其实TCP中已经为我们实现了一个叫做心跳的机制。如果你设置了心跳,那TCP就会在一定的时间(比如你设置的是3秒钟)内发送你设置的次数的心跳(比如说2次),并且此信息不会影响你自己定义的协议。所谓“心跳”就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己“在线”。 以确保链接的有效性。
四、网络层
提供逻辑地址与路由
4.1 四类IP地址,子网划分的计算,特殊的IP段,保留地址
注:
1. 无论是A,B,C类哪种地址,主机号host-id全0表示本主机,全1表示本网络(net-id一样)的所有主机,用于广播。所以,在计算主机数的时候需要 -2.
2. A 类地址中,网络号为全1(即127,127.xxx.xxx.xxx)的一组保留用作本地软件环回测试地址,如127.0.0.1;网络号全0(即0.0.0.0)表示本网络.所以用户可用的A类网络有 2^7-2个,每个网络的主机数为 2^24-2。
3. B类地址中,网络号为 128(即1000 0000)的被保留,不可指派,所以B类地址的网络数为2^14-1,每个网络的主机数为 2^16-2。
4. C类地址中,网络号为192(即1100 0000) 的被保留,不可指派,所以C类的地址的网络数为 2^21-1,每个网络的主机数为 2^8-2。
5. D类地址不指向特定网络,用在多播中。
6. 其他保留的IP地址 10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用于内部)
子网掩码是用来计算网络地址的值,子网掩码和该网络中如何一个主机的IP地址按位与,得到该网络的net-id网络号,其余位为0。
4.2 ARP是地址解析协议,简单语言解释一下工作原理
ARP将IP地址转换为MAC地址
1. 首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
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地址对应着不同的端口,这样看来就会保护子网内的用户。