计算机网络
*1.OSI,TCP/IP,五层协议的体系结构,以及各层协议
答:
OSI:开放系统互联(Open System Interconnection)
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网络层、传输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、传输层、 应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)
数据链路:PPP、ARP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包Packet)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
(1.ICMP是(Internet Control Message Protocol)Internet控制报文协议。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
2.RIP(Routing Information Protocol)路由信息协议)
3.PPP点对点协议(Point to Point Protocol) PPP(点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。
*2.TCP三次握手和四次挥手的全过程
三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
(为什么三次握手:谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。)
四次握手:
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
*3.TCP和UDP的区别?
(1.特点、举例; 2.协议; 3.TCP可靠性)
TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。
TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。
TCP对应的协议和UDP对应的协议
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
TCP(传输控制协议):
1)提供IP环境下的数据可靠传输,主要有:超时重传机制(发送端在RTO时间内未收到接收端的ack确认信息);拥塞控制(慢启动和拥塞避免);字节流顺序(每个字节都有一个序号);面向连接。全双工操作(数据在两个方向上可同时传送),多路复用,端到端的传输。
2)面向连接:全双工通信方式,通信前双方建立连接(三次握手),再数据传送。通信结束后要断开连接(四次挥手)。
3)TCP支持的应用协议主要有:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。适用于传输数据量大,可靠性要求高的应用,但是效率较低。
UDP(用户数据报协议):
1)面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接传送,即时通信比如短信,QQ,在线视屏(花屏一两次也没事)),不提供可靠传输(拥塞控制,差错恢复),用于传送少量数据,可靠性要求低的应用。
2)UDP支持的应用协议:NFS(网络文件系统),SNMP(简单网络管理系统)、DNS(主域名系统)。
Moreover:TCP可用于网络数据库,分布式高精度计算系统的数据传输;UDP可用于内部局域网(丢包错误率较低)
参考:TCP拥塞控制
*4.TCP的可靠性如何保证?
(1.超时重传;2.拥塞控制;3.面向连接)
超时重传机制(发送端在RTO时间内未收到接收端的ack确认信息);拥塞控制(慢启动和拥塞避免);字节流顺序(每个字节都有一个序号);面向连接
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度) 2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(启动时钟,超时重发)
参考:网络常见面试题、TCP传输可靠性
*5.ARP协议的工作原理
地址解析协议,即ARP(Address Resolution Protocol)
*6.在浏览器中输入网址后执行的全部过程
1)客户端浏览器通过DNS解析到http://www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2)在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3)客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4)客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
7.NAT协议、DHCP协议、DNS协议的作用
NAT协议:网络地址转换(NAT,Network AddressTranslation)属接入广域网(WAN)技术,
是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
借助于NAT,私有(保留)地址的"内部"网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,一个局域网只需使用少量IP地址(甚至是1个)即可实现私有地址网络内所有计算机与Internet的通信需求。
DHCP协议:动态主机设置协议(Dynamic Host ConfigurationProtocol, DHCP)
是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
DNS协议:DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
*1.从地址栏里输入网址,回车直到页面打开。按照TCP/IP协议,从应用层到链路层经过哪些协议?他们的作用?
应用层(Application):
HTTP超文本传输协议,提供www等服务。输入的网址包含http://,一般为默认。
DNS动态域名系统,提供域名到IP地址的解析
FTP文件传输协议,提供文件的传送,如上传,下载
RIP路由信息协议,提供路由信息
传输层(Transport):
TCP传输控制协议,提供面向连接的,端到端的,可靠的数据传输
UDP用户数据报协议,提供面向无连接的,不可靠的,快捷的数据传输
网际层(Internet):
IP因特网通信协议,负责选择数据传送的道路。主要有两个功能:寻址,分段。
ARP地址解析协议,提供IP地址到MAC地址的解析
ICMP控制报文协议,提供IP主机,路由器之间控制消息(网络通不通)的传递。
链路层(link):
PPP点对点协议,提供路由器之间或者主机之间的连接
(PS:OSI中ARP是链路层;TCP/IP中ARP是网际层)
*2.HTTP, HTTPS 和 SSL
HTTP是超文本传输协议 Hyper Text Transfer Protocol, 它主要负责web server和web浏览器之间的通讯,HTTP协议把web client (浏览器)的请求发送到一个web server, 并把网页内容从web server返回到浏览器。常用请求包括get和post两种,
HTTPS 是安全超文本传输协议 Secure HTTP, 主要用于在web server和web 浏览器之间进行隐私数据的传输
SSL – Secure Sockets Layer(安全套接层), SSL协议用于安全数据传输的数据加密
参考:Http常见面试
*3.四次挥手过程,如果主动关闭方没有等待2MSL,会如何?
MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
A发出ACK,等待ACK到达对方的超时时间MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到ACK。
*4.HTTP响应的结构是怎么样的?
答:HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。
主体(Body):它包含了响应的内容。它可以包含 HTML 代码,图片,等等。主体是由传输在 HTTP 消息中紧跟在头部后面的数据字节组成的。
HTTP状态码:
成功2××:成功处理了请求的状态码。
重定向3××:重定向
客户端错误4××:表示请求可能出错,妨碍了服务器的处理。
服务器错误5××:表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
*5.Get和Post的差别
1.从HTTP标准来看Get和Post
get:get用于标识获取资源而用的,他有两种特性2.从应用角度来看
get
1.get请求参数放在URL后面,格式是URL?key1=value1&key2=value2...,可以在链接看到参数
2.理论上HTTP并没有对URL长度进行限制,也就是对get参数没有长度限制,但是一般用户打开链接都是通过浏览器,因此会受到浏览器或者操作系统限制长度,比较常见的限制长度是1024字节。
post
1.post请求数据会放在HTTP包中,保密性相对安全。
2.HTTP标准也没有对POST数据进行限制,但是会受到服务端的长度限制,如处理的程序(PHP),服务器引擎(Apache)。
3.总结
get适合于查询区分某些特定数据的页面,如商品展示。
由于post的HTTP标准,因此更适合做数据的改变,而且由于应用角度上的数据传递方式,更适合用于登录注册功能页,因为不会被别人明眼看到数据(其实就算用POST,如果用心搞你,可以通过捉包去获取数据,也不是说安全挺多的)。
-
HTTP请求报文和响应报文
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
1.请求头
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
2.请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
3.空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
4.请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应报文
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
状态行格式如下:
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:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
举个例子:HTTP/1.1 200 OK(CRLF)。
- IP协议
IP协议规定了数据传输的基本单元和格式。IP可以根据数据包包头中包括的目的地址将数据包传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。
- IP头、TCP头、UDP头
IP头结构的定义
(五层:1.版本4+头4+服务类型8,数据包长度16; 2.数据包标识16+标志位3+段偏移13; 3.存活时间8+协议类型8+首部校验和16; 4.源IP32; 5.目的IP32;)
/*IP头定义,共20个字节*/
typedef struct _IP_HEADER
{
char m_cVersionAndHeaderLen; //版本信息(前4位),头长度(后4位)
char m_cTypeOfService; // 服务类型8位
short m_sTotalLenOfPacket; //数据包长度
short m_sPacketID; //数据包标识
short m_sSliceinfo; //分片使用
char m_cTTL; //存活时间
char m_cTypeOfProtocol; //协议类型
short m_sCheckSum; //校验和
unsigned int m_uiSourIp; //源ip
unsigned int m_uiDestIp; //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;
TCP头结构定义
(五层:1.源16+目的16; 2.序列号; 3.确认号;4.TCP头4+保留6+标志位6,窗口16; 5.校验和16位+紧急指针16位)
/*TCP头定义,共20个字节*/
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize; // 窗口大小16bit
short m_sCheckSum; // 检验和16bit
short m_surgentPointer; // 紧急数据偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
/*TCP头中的选项定义
kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容(如果有的话)
KIND = 1表示 无操作NOP,无后面的部分
2表示 maximum segment 后面的LENGTH就是maximum segment选项的长度(以byte为单位,1+1+内容部分长度)
3表示 windows scale 后面的LENGTH就是 windows scale选项的长度(以byte为单位,1+1+内容部分长度)
4表示 SACK permitted LENGTH为2,没有内容部分
5表示这是一个SACK包 LENGTH为2,没有内容部分
8表示时间戳,LENGTH为10,含8个字节的时间戳
*/
typedef struct _TCP_OPTIONS
{
char m_ckind;
char m_cLength;
char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;
UDP头结构的定义
(两层:1.源端口16+目的端口16; 2.数据包长度16+校验和16;)
/*UDP头定义,共8个字节*/
typedef struct _UDP_HEADER
{
unsigned short m_usSourPort; // 源端口号16bit
unsigned short m_usDestPort; // 目的端口号16bit
unsigned short m_usLength; // 数据包长度16bit
unsigned short m_usCheckSum; // 校验和16bit
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;