前几个问题主要是操作系统相关的问题,主要是参考网上前辈的文章做的笔记,供参考之用。前几个问题主要是操作系统的问题,也是一个Java工程师需要了解的内容。中间夹杂了一些问题是网络方面的问题,大体分为两块,一个TCP协议,一个HTTP协议,也对与Java以及Android工程师十分重要。
Window内存管理方式:段存储,页存储,段页存储
- 页式管理的优点是没有外碎片,每个内碎片不超过页的大小。缺点是,程序全部装入内存,要求有相应的硬件支持。
- 段式管理优点是可以分别编写和编译,可以针对不同类型的段采用不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。缺点是会产生碎片。
- 段页式管理是段式管理与页式管理方案结合而成的所以具有他们两者的优点。但反过来说,由于管理软件的增加,复杂性和开销也就随之增加了。
OSI与TCP/IP各层的结构与功能,都有哪些协议
OSI模型 | TCP/IP模型 | 对应PDU(协议数据单元) |
---|---|---|
应用层 | 应用层 | 数据 |
表示层 | 应用层 | 数据 |
会话层 | 应用层 | 数据 |
传输层 | 传输层 | 段 |
网络层 | 网络层 | 包 |
数据链路层 | 网络接口层 | 帧 |
物理层 | 网络接口层 | 比特流 |
ISO/OSI参考模型与TCP/IP协议模型
相同点:1、都有应用层、传输层、网络层。
2、都是下层服务上层。
不同点:层数不同。
首先我们要了解OSI七层模型各层的功能。
第七层:应用层,提供用户程序“接口”。
第六层:表示层,特定功能的实现,如数据加密。
第五层:会话层,允许不同机器上的用户之间建立会话关系,如WINDOWS。
第四层:传输层,实现网络不同主机上用户进程之间的数据通信,可靠与不可靠的传输,传输层的错误检测,流量控制等。
第三层:网络层,提供逻辑地址(IP)、选路,数据从源端到目的端的传输。
第二层:数据链路层,将上层数据封装成帧,用MAC地址访问媒介,错误检测与修正。
第一层:物理层,设备之间比特流的传输,物理接口,电气特性等。
OSI 七层模型称为开放式系统互联参考模型,是一种框架性的设计方法。
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能使就是帮助不同类型的主机实现数据传输。
物理层 : O S I 模型的最低层或第一层,该层包括物理连网媒介,如电缆连线连接器。物理层的协议产生并检测电压以便发送和接收携带数据的信号。在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。网络物理问题,如电线断开,将影响物理层。
数据链路层: O S I 模型的第二层,它控制网络层与物理层之间的通信。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的网络地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。
网络层: O S I 模型的第三层,其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。
网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B 的最佳路径。由于网络层处理路由,而路由器因为即连接网络各段,并智能指导数据传送,属于网络层。在网络中,“路由”是基于编址方案、使用模式以及可达性来指引数据的发送。
传输层: O S I 模型中最重要的一层。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如,以太网无法接收大于1 5 0 0 字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。该过程即被称为排序。
工作在传输层的一种服务是 T C P / I P 协议套中的T C P (传输控制协议),另一项传输层服务是I P X / S P X 协议集的S P X (序列包交换)。
会话层: 负责在网络中的两节点之间建立和维持通信。 会话层的功能包括:建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对 话,决定通信是否被中断以及通信中断时决定从何处重新发送。
你可能常常听到有人把会话层称作网络通信的“交通警察”。当通过拨号向你的 I S P (因特网服务提供商)请求连接到因特网时,I S P 服务器上的会话层向你与你的P C 客户机上的会话层进行协商连接。若你的电话线偶然从墙上插孔脱落时,你终端机上的会话层将检测到连接中断并重新发起连接。会话层通过决定节点通信的优先级和通信时间的长短来设置通信期限
表示层: 应用程序和网络之间的翻译官,在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。
表示层管理数据的解密与加密,如系统口令的处理。例如:在 Internet上查询你银行账户,使用的即是一种安全连接。你的账户数据在发送前被加密,在网络的另一端,表示层将对接收到的数据解密。除此之外,表示层协议还对图片和文件格式信息进行解码和编码。
应用层: 负责对软件提供接口以使程序能使用网络服务。术语“应用层”并不是指运行在网络上的某个特别应用程序 ,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。
TCP/IP:
数据链路层:ARP,RARP
网络层: IP,ICMP,IGMP
传输层:TCP ,UDP,UGP
应用层:Telnet,FTP,SMTP,SNMP.
OSI:
物理层:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
数据链路层:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2
网络层:IP,IPX,AppleTalk DDP
传输层:TCP,UDP,SPX
会话层:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP
表示层:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML
应用层:FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP
TCP/IP整体构架分析
而TCP/IP协议采用了4层结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
这4层分别为:
应用层:应用程序间沟通的层,如简单电子邮件传输协议(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:此层提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
下面简单介绍TCP/IP中协议的功能:
1. IP 网际协议:IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。
- TCP
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层、设备驱动程序和物理介质、最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、Xwindows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。
3.UDP
UDP与TCP位于同一层,但不提供任何顺序或重新排序功能,因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询—应答的服务,例如NFS。欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
4.ICMP
ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的’Redirect’信息通知主机通向其他系统的更准确的路径,而’Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接’体面地’终止。PING是最常用的基于ICMP的服务。
TCP与UDP的区别
区别 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠的 | 不可靠的 |
应用场合 | 传输大量的数据 | 少量数据 |
速度 | 慢 | 快 |
UDP
UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。
TCP
TCP的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。
为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它。
TCP报文结构
TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节长度(160位),但在一些需求情况下,会使用“可选字段”,这时,首部长度会有所增加,但最长不超过60字节。(字节 byte 位 bit 1 byte = bit)
【源端口】- 16bit
来源处的端口号。
【目的端口】- 16bit
目的处的端口号;
【序号】- 32bit
TCP在对数据进行分段的时候,会给每一个TCP报文段添加一个序号,序号字段的值其实是该文段所发送的数据的第一个字节的序号。这么做的原因是,TCP是面向连接的可靠服务,这个序号可以保证数据在传输过程中保持有序性,接受端可以通过这个序号确认收到的数据的完整性和先后顺序;
【确认号】- 32bit
确认号,是期望收到对方的下一个报文段的数据的第一个字节的序号;
【数据偏移】- 4bit
其实它本质上就是“首部长度”,因为“数据偏移”是指TCP报文段的数据部分的起始处距离TCP报文段的起始处的距离。
数据偏移总共占4bit,因此最大能表示的数值为15。但TCP的报文头部至少为20字节。因此数据偏移的单位是“4字节”,此处的设计和IP数据报的设计是完全相同的,所以说TCP报文段首部的长度最长为15×4=60字节,且首部长度必须为4字节的整数倍。
【保留字段】- 6bit
这6bit在标准中是保留字段,留待以后使用,必须为0。我猜测,有两个目的,第一个是预留除URG/ACK/PSH/RST/SYN/FIN/之外的冗余功能位;第二个是为了对齐字节位。
【控制位】- 6bit
又称为TCP flag,该字段从左到右分为以下六个字段,指明包的类型。同时用于控制TCP的状态机,同时ACK和SYN与三次握手协议有关,FIN与四次挥手协议有关。
① 紧急字段URG - 1bit
当URG=1时,此字段告诉系统此报文段中有紧急数据,应尽快传送。
② 确认字段ACK - 1bit
当ACK=1时,表示确认,且确认号有效;当ACK=0时,确认号字段无效。
③ 推送字段PSH - 1bit
当PSH=1时,则报文段会被尽快地交付给目的方,不会对这样的报文段使用缓存策略。
④ 复位字段RST - 1bit
当RST为1时,表明TCP连接中出现了严重的差错,必须释放连接,然后再重新建立连接。
⑤ 同步字段SYN - 1bit
当SYN=1时,表示发起一个连接请求。
⑥ 终止字段FIN - 1bit
用来释放连接。当FIN=1时,表明此报文段的发送端的数据已发送完成,并要求释放连接。
【窗口字段】- 16bit
此字段用来控制对方发送的数据量,单位为字节。
一般TCP连接的其中一端会根据自身的缓存空间大小来确定自己的接收窗口大小,然后告知另一端以确定另一端的发送窗口大小。该字段与TCP的流量控制服务有关。
【校验和字段】- 16bit
与IP协议的检验和不同,TCP的这个校验和是针对首部和数据两部分的。
【紧急指针字段】- 16bit
紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
(3)TCP报文的可选项
在TCP报文头部的前20个字节是固定的。有时TCP报文也会在报文头部增加一些选项,该部分的长度不固定,不同的应用场景会有所变化。
该部的可选项常用的包含但不仅限于有以下几种:
① 最大报文传输段(即常提到的MSS): 用于确定每一个TCP报文段中科传输的最大的数据长度(注意,不包括头部)
② 窗口扩大选项:TCP的窗口大小最大为64K,在大多数时候这是够用的,但有时候为了提高吞吐量,就需要对窗口扩大,这个时候,就需要使用该选项对窗口进行扩大。
③ 时间戳选项:可以用来计算RLL,进而可以用于TCP的拥塞控制。
TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用
第一次握手:客户机A发送标识位SYN = 1,随机产生序列号seq = x的数据包到服务器B,服务器B由SYN = 1知道客户机A要建立连接,并进入SYN_SEND状态,等待服务器确认;;
第二次握手:服务器B收到请求并确认联机信息后,向客户机A发送标识位SYN = 1,ACK = 1和随机产生的序列号seq = y, 确认码ack number = x+1(客户机A发送的seq+1)的数据包,此时服务器进入SYN_RECV状态;
第三次握手:客户机A收到后检查确认码ack number是否正确,即和第一次握手发送的序列号加1结果是否相等,以及ACK标识位是否为1;若正确,客户机A发送标识位ACK = 1、seq = x + 1和确认码ack number = y + 1(服务器B发送的seq+1)到服务器B,服务器B收到后确认ACK=1和seq是否正确,若正确则完成建立连接,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据.。
对于建链接的3次握手,主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
TCP的四次挥手
对于4次挥手,其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。上图是双方同时断连接的示意图。
第一次挥手:客户端A发送一个FIN = 1、初始化序列号seq = u,到服务器B,用来主动关闭客户A到服务器B的数据传送,客户机A进入FIN-WAIT-1状态,等待服务器B发送FIN;
第二次挥手:服务器B收到这个FIN,它发回ACK = 1、确认序号ack number为收到的序号加1(ack number=u+1);和SYN一样,一个FIN将占用一个序号seq = v,客户机A进入FIN-WAIT-2,稍后关闭连接,服务器B进入CLOSE_WAIT,等待关闭连接;
第三次挥手:服务器B关闭与客户端A的连接,发回标识位FIN = 1,ACK = 1,seq = w和确认码ack number=u+1给客户端A,服务器B进入LAST_ACK,等待最后一次ACK确认;
第四次挥手:客户端A发送ACK = 1报文确认,并将确认序号设置为收到序号加1(ack number=w+1)到服务器B,客户机A进入TIME-WAIT等待2MAL后进入CLOSE可用状态,服务器B进入CLOSE可用状态。
总结
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
- TIMEWAIT的作用?
主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_WAIT状态一般维持在1-4分钟。
TCP拥塞控制
由于发送方到接收方之间的信道是公用的,因此如果发送方不考虑中间信道的容量随意发送就可能出现拥塞,拥塞会导致延迟严重,甚至大量丢包,因此我们需要进行拥塞控制。
拥塞控制的关键在于控制发送端的发送速率,发送端的发送速率受到发送窗口大小的限制,因此在TCP的拥塞控制中实际控制的是发送端的发送窗口大小。
当出现以下两种情况之一时,我们断定传输出现了拥塞:
- 连续(三个)的序号为x的ACK:说明序号为x的TCP数据段很可能丢失
- 超时时间到来前未收到ACK
当出现拥塞时,我们主要有以下方法进行拥塞控制:
AIMD
AIMD(additive increase multiplicative decrease)的意思即加性增加乘性减少,其初始拥塞窗口大小为任意值。
当我们每成功传输一个TCP数据段,拥塞窗口大小加1MSS(最大报文大小),此为加性增加;而当我们发现传输出现拥塞时,拥塞窗口大小减半,此为乘性减少。
这种算法的问题在于增加的速度慢,丢包代价大。-
慢启动
慢启动的初始时拥塞窗口大小为1MSS(因此叫慢启动算法),最大为65535MSS(窗口大小只有16bit,因此最大也只能这么大)。慢启动算法开始时每成功传输一个TCP数据段,拥塞窗开大小也是增加1MSS,但当其发现拥塞时,会首先确定一个阙值:阙值为当前窗口大小的一半,然后根据不同的机制进行处理:- Tahoe机制
出现拥塞时窗口大小会变回1MSS,但当窗口大小小于阙值时,传输成功窗口大小加倍(指数增长),大于阙值后改为加性增长。 - Reno机制
出现拥塞窗口大小直接变为阙值。(也称为快速恢复机制)
- Tahoe机制
TCP滑动窗口与回退N针协议
TCP作为一个提供可靠服务的传输层协议,对于数据的发送必须拥有一套良好的反馈机制,让发送方得知接收方接收到了数据,而TCP下的反馈机制大部分借鉴与数据链路层的反馈机制,因此在此我们分析一下数据链路层的反馈机制。
1.停等协议
停等协议是一种非常简单的协议,发送方在发送完一帧数据后就一直等待接收方的确认信号(ACK),要是超时就重传数据,只到收到ACK信号后才发送下一帧数据。停等协议效率较低(如此低效数据链路层都不适用,TCP协议当然也不用了)。
2.滑动窗口协议之GoBackN
由于发完一帧数据后发送方就挂起等待的行为非常低效,因此滑动窗口协议诞生了。滑动窗口的意思其实就是一个缓冲区(发送方为发送窗口,接收方为接收窗口),缓冲区的内容会随着数据的发送而移动,因此称为滑动窗口。
我们先来讲讲滑动窗口协议中的GoBackN协议。滑动窗口协议允许发送方连发数帧,每发一帧都对应 一个计时器timeout,而GoBackN协议要求发送方把丢失帧及其之后的帧全部重传(因为光凭一个ACK并不能确定哪些帧出现了丢失,ACK的含义是:期待接收序号为N的帧,之前所有的帧都已经成功收到并依此交给了上层)。
3.滑动窗口协议之选择性重发
由于GoBackN中重发已经发送过的数据有点多余,因此选择性重发协议诞生了。选择性重发协议在ACK上引入了NAK的概念(否定性确认帧),表示小于N的帧已经全部收到并交给了上层,而第N帧丢失了,要求重发第N帧。当发送方接到NAK后,只要重发NAK表示的那一帧即可。
Http的报文结构
Http协议(Hypertext Transfer Protocol)即超文本传输协议,它是一个应用层的基于TCP的无状态的协议,一般的通信过程为:建立连接、发送请求、响应请求、释放连接。其报文结构分为请求头与响应头两种:
请求头
请求头的第一行为请求行,其包括了三部分重要内容:
请求方法:主要为Get、Post等方法。例如,GET /index.html HTTP/1.1。
URL:即请求的地址
协议版本:主要有Http1.0和Http1.1两种
请求头接下来是请求头部(也叫头域),头域的长度是不固定的,每一个头域属性的格式为:字段名:值(如:Range:请求范围)
典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
头域下面是一行空行,表示头域的结束。
空行下来就是请求要提交的数据。
响应头
与请求头类似,响应头的第一行为响应行,主要包含如下三部分内容:
版本:使用的Http协议版本
状态码:表示处理结果状态的数值,由三位数字组成,第一位数字表示响应的类型,主要有以下几种:
1XX:表示服务器已接收了客户端请求,客户端可继续发送请求
2XX:表示服务器已成功接收到请求并进行处理
3XX:表示服务器要求客户端重定向
4XX:表示客户端的请求有非法内容
5XX:表示服务器未能正常处理客户端的请求而出现意外错误
原因短语:一串用于解释返回该状态码原因的字符串
响应行下来是响应头域,与请求头类似。
响应头域下来是一行空行表示响应头域的结束。
最后是响应头的响应实体内容。
例子:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html> <head> <title>Wrox Homepage</title> </head> <body> <!-- body goes here --> </body> </html>
Http的状态码含义
-
1XX:表示服务器已接收了客户端请求,客户端可继续发送请求
100 (Continue/继续)
如果服务器收到头信息中带有100-continue的请求,这是指客户端询问是否可以在后续的请求中发送附件。在这种情况下,服务器用100允许客户端继续或用417 (Expectation Failed)告诉客户端不同意接受附件。这个状态码是 HTTP 1.1中新加入的。101 (Switching Protocols/转换协议)
101 状态码是指服务器将按照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新加入的。
-
2XX:表示服务器已成功接收到请求并进行处理
200 (OK/正常)
200 的意思是一切正常。一般用于相应GET和POST请求。201 (Created/已创建)
201表示服务器在请求的响应中建立了新文档;应在定位头信息中给出它的URL。202 (Accepted/接受)
202告诉客户端请求正在被执行,但还没有处理完。203 (Non-Authoritative Information/非官方信息)
状态码203是表示文档被正常的返回,但是由于正在使用的是文档副本所以某些响应头信息可能不正确。这是 HTTP 1.1中新加入的。204 (No Content/无内容)
在并没有新文档的情况下,204确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页非常有用,并且你可以确定先前的页面是否已经更新。但是,这种方法对通过刷新响应头信息或等价的HTML标记自动重载的页面起作用,因为它会返回一个204状态码停止以后的重载。但基于JavaScript脚本的自动重载在这种情况下仍然需要能够起作用。205 (Reset Content/重置内容)
重置内容205的意思是虽然没有新文档但浏览器要重置文档显示。这个状态码用于强迫浏览器清除表单域。这是 HTTP 1.1中新加入的。206 (Partial Content/局部内容)
206是在服务器完成了一个包含Range头信息的局部请求时被发送的。这是 HTTP 1.1中新加入的。
-
3XX:表示服务器要求客户端重定向
300 (Multiple Choices/多重选择)
300表示被请求的文档可以在多个地方找到,并将在返回的文档中列出来。如果服务器有首选设置,首选项将会被列于定位响应头信息中。301 (Moved Permanently)
301状态是指所请求的文档在别的地方;文档新的URL会在定位响应头信息中给出。浏览器会自动连接到新的URL。302 (Found/找到)
与301有些类似,只是定位头信息中所给的URL应被理解为临时交换地址而不是永久的。注意:在 HTTP 1.0中,消息是临时移动(Moved Temporarily)的而不是被找到。303 (See Other/参见其他信息)
这个状态码和 301、302 相似,只是如果最初的请求是 POST,那么新文档(在定位头信息中给出)药用 GET 找回。这个状态码是新加入 HTTP 1.1中的。304 (Not Modified/为修正)
当客户端有一个缓存的文档,通过提供一个 If-Modified-Since 头信息可指出客户端只希望文档在指定日期之后有所修改时才会重载此文档,用这种方式可以进行有条件的请求。304是指缓冲的版本已经被更新并且客户端应刷新文档。另外,服务器将返回请求的文档及状态码 200。305 (Use Proxy/使用代理)
305表示所请求的文档要通过定位头信息中的代理服务器获得。这个状态码是新加入 HTTP 1.1中的。307 (Temporary Redirect/临时重定向)
浏览器处理307状态的规则与302相同。307状态被加入到 HTTP 1.1中是由于许多浏览器在收到302响应时即使是原始消息为POST的情况下仍然执行了错误的转向。只有在收到303响应时才假定浏览器会在POST请求时重定向。添加这个新的状态码的目的很明确:在响应为303时按照GET和POST请求转向;而在307响应时则按照GET请求转向而不是POST请求。该状态码是新加入HTTP 1.1中的。
-
4XX:表示客户端的请求有非法内容
400 (Bad Request/错误请求)
400指出客户端请求中的语法错误。401 (Unauthorized/未授权)
401表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个响应必须包含一个WWW-Authenticate的授权信息头。403 (Forbidden/禁止)
403的意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。404 (Not Found/未找到)
404状态每个网络程序员可能都遇到过,他告诉客户端所给的地址无法找到任何资源。它是表示“没有所访问页面”的标准方式。405 (Method Not Allowed/方法未允许)
405指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不允许使用。该状态码是新加入 HTTP 1.1中的。406 (Not Acceptable/无法访问)
406表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。406是新加入 HTTP 1.1中的。407 (Proxy Authentication Required/代理服务器认证要求)
407与401状态有些相似,只是这个状态用于代理服务器。该状态指出客户端必须通过代理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端,这会引起客户端使用带有Proxy-Authorization请求的头信息重新连接。该状态码是新加入 HTTP 1.1中的。408 (Request Timeout/请求超时)
408是指服务端等待客户端发送请求的时间过长。该状态码是新加入 HTTP 1.1中的。409 (Conflict/冲突)
该状态通常与PUT请求一同使用,409状态常被用于试图上传版本不正确的文件时。该状态码是新加入 HTTP 1.1中的。410 (Gone/已经不存在)
410告诉客户端所请求的文档已经不存在并且没有更新的地址。410状态不同于404,410是在指导文档已被移走的情况下使用,而404则用于未知原因的无法访问。该状态码是新加入 HTTP 1.1中的。411 (Length Required/需要数据长度)
411表示服务器不能处理请求(假设为带有附件的POST请求),除非客户端发送Content-Length头信息指出发送给服务器的数据的大小。该状态是新加入 HTTP 1.1的。412 (Precondition Failed/先决条件错误)
412状态指出请求头信息中的某些先决条件是错误的。该状态是新加入 HTTP 1.1的。413 (Request Entity Too Large/请求实体过大)
413告诉客户端现在所请求的文档比服务器现在想要处理的要大。如果服务器认为能够过一段时间处理,则会包含一个Retry-After的响应头信息。该状态是新加入 HTTP 1.1的。414 (Request URI Too Long/请求URI过长)
414状态用于在URI过长的情况时。这里所指的“URI”是指URL中主机、域名及端口号之后的内容。该状态是新加入 HTTP 1.1的。415 (Unsupported Media Type/不支持的媒体格式)
415意味着请求所带的附件的格式类型服务器不知道如何处理。该状态是新加入 HTTP 1.1的。416 (Requested Range Not Satisfiable/请求范围无法满足)
416表示客户端包含了一个服务器无法满足的Range头信息的请求。该状态是新加入 HTTP 1.1的。417 (Expectation Failed/期望失败)
如果服务器得到一个带有100-continue值的Expect请求头信息,这是指客户端正在询问是否可以在后面的请求中发送附件。在这种情况下,服务器也会用该状态(417)告诉浏览器服务器不接收该附件或用100状态告诉客户端可以继续发送附件。该状态是新加入 HTTP 1.1的。
-
5XX:表示服务器未能正常处理客户端的请求而出现意外错误
500 (Internal Server Error/内部服务器错误)
500是常用的“服务器错误”状态。501 (Not Implemented/未实现)
501状态告诉客户端服务器不支持请求中要求的功能。例如,客户端执行了如PUT这样的服务器并不支持的命令。502 (Bad Gateway/错误的网关)
502被用于充当代理或网关的服务器;该状态指出接收服务器接收到远端服务器的错误响应。503 (Service Unavailable/服务无法获得)
状态码503表示服务器由于在维护或已经超载而无法响应。504 (Gateway Timeout/网关超时)
该状态也用于充当代理或网关的服务器;它指出接收服务器没有从远端服务器得到及时的响应。该状态是新加入 HTTP 1.1的。505 (HTTP Version Not Supported/不支持的 HTTP 版本)
505状态码是说服务器并不支持在请求中所标明 HTTP 版本。该状态是新加入 HTTP 1.1的。
Http request的几种类型
GET: 请求指定的页面信息,并返回实体主体
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体
PUT: 从客户端向服务器传送的数据取代指定的文档的内容
DELETE: 请求服务器删除指定的页面
OPTIONS: 允许客户端查看服务器的性能
TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容
PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别
MOVE: 请求服务器将指定的页面移至另一个网络地址
COPY: 请求服务器将指定的页面拷贝至另一个网络地址
LINK: 请求服务器建立链接关系
UNLINK: 断开链接关系
WRAPPED: 允许客户端发送经过封装的请求
CONNECT:用于动态切换到隧道的代理
其中Http1.0仅支持GET、HEAD和POST,其余方法均为Http1.1添加。
GET方法参数写在URL上,POST参数写在请求实体内容中,且GET方法参数不大于1024Byte,POST则没有限制。
Http1.1和Http1.0的区别
部分内容需要参考上面两个问题。
- 是否允许复用连接:Http1.0不允许,响应请求后就断开连接,Http1.1允许且默认开启连接复用
- Host头域:Http1.0没有,Http1.1有
- 状态码:Http1.1比Http1.0多了100,101,203,205等状态码(参上)
- 请求方式:Http1.0只有GET、HEAD和POST方法,Http1.1新增了其他多种方法(参上)
Http怎么处理长连接
长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
Http协议是一个短连接、无状态的基于TCP的协议,默认的流程是:建立连接–>发送请求–>响应请求–>断开连接。
在Http1.1中加入了保持长连接的功能,可以通过Http头域属性Connection:keep-alive开启。
Cookie与Session的作用与原理
由于Http协议是一种短连接的、无状态的协议,因此如果我们一般无法获取客户端以前的请求信息与状态信息。
为了解决这个问题,保存请求的状态,Cookie和Session出现了。简单来说,Cookie存于客户端,而Session存于服务器,它们都保存和用户历史请求相关的信息。在发送Http请求时Cookie或SessionId会随被加入请求参数中一起发给服务器,服务器根据Cookie的信息或SessionId查找到的Session信息来得知客户端的状态信息,进而进行进一步的相关操作。
Cookie
- cookie被存储于客户端
- cookie在RFC有定义
- 与cookie相关的头域参数有cookie和set-cookie
Session
- session被存储在服务器
- session并没有在Http协议中有明确的定义
- session通过sessionId来区分不同的用户
- 与cookie相比,存储在服务器的session显得更为安全
- session通常的实现方法有两种:
- 通过cookie实现,在cookie中存储sessionId
- 回写URL实现,在网页的连接中加入sessionId
电脑*问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP
在电脑*问一个网页主要有一下步骤:
- 我们在浏览器中输入网址,但电脑并不认识如此复杂的字符串,因此电脑使用DNS服务解析出对应的IP地址
- 访问网页的过程基于Http协议,因此我们访问网页的过程实际上就是Http协议发送请求和响应请求的过程
- Http协议是应用层协议,它基于传输层的TCP协议,TCP协议描述了进程与进程间如何通信交流,把具体的传输过程交给下层的网络层
- 网络层由IP协议控制数据包的路由选择和存储转发,但由于网络上的主机太多,IP协议管理不过来,因此又把网络主机分为多块,在外部使用EGP外部网关协议,在内部使用IGP内部网关协议(包括RIP协议与OSPF协议)
- 当网络层的数据传输到以太网后,就通过ARP协议获取目标主机的MAC地址,最后把数据传输的任务交给数据链路层处理
Ping的整个过程。ICMP报文是什么
ICMP即Internet Control Message Protocol,网络控制报文协议,是一个网络层的用于在IP主机、路由器之间传递控制消息的协议。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
其中Ping是ICMP协议中的指令之一,其主要作用的是检查网络的连通情况和检测网络的速度。
Ping的过程主要有如下步骤:
检查本地ARP缓存,查找目标主机的MAC地址
如果没有找到MAC地址,使用ARP协议获取目标主机MAC地址,并放入ARP缓存
发出ICMP echo request包,接收ICMP echo reply包
IP地址分类
IP地址分为IPv4地址(32位)和IPv6地址(128位),在此我们讨论IPv4地址。
IP地址由两部分(网络部分和主机部分)组成,可以分为有类网和无类网两类。
有类网
有类网分为以下5种:
A类网:第一位为0,后7位为网络号,剩余24位为主机号
B类网:前两位为10,后14位为网络号,剩余16位为主机号
C类网:前三位为110,后21位为网络号,剩余8位为主机号
D类网(不可用):前四位为1110,后28位为多播地址
E类网(不可用):前四位为1111,被保留
除了D类网与E类网不能使用外,A、B和C类网IP均可用来表示一台主机。我们一般根据自己网络中主机的多少来选择A、B还是C类网,但一般而言网路中的主机数目都不会刚好等于有类网提供的主机数,于是经常会造成有多余的IP地址浪费,因此我们有了无类网。
无类网
无类网加入了子网掩码的概念。子网掩码是一个32位地址,用于将某个IP地址划分成网络地址和主机地址两部分。在子网掩码中我们以1表示为网络号,例:255.255.255.0表示前24位为网络号。
路由器与交换机区别
路由器工作于网络模型的网络层,其主要的功能是路由选择与存储转发,路由器上还能开启ACL访问控制列表、NAT地址转换等功能,扩展网络应用。
交换机工作于网络模型的数据链路层,其主要的功能是泛洪、存储转发、过滤和自学习,交换机还能够隔离冲突域,并划分VLAN。
进程的几种状态
进程执行时的间断性决定了进程可能具有多种状态,最基本的三种状态如下:
就绪状态:当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,就可以立即运行,进程这时的状态称为就绪状态。在一个系统中可能多个进程处于就绪状态,通常将它们排成一个队列,称为就绪队列。
执行状态:进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态,在多处理机系统中,则有多个进程处于执行状态。
阻塞状态:处于执行状态的线程由于发生某事件而暂停无法继续执行时,便放弃处理机而处于暂停状态,此时进程的状态称为阻塞状态,或等待状态或*状态。如IO请求,申请缓存空间等,处于阻塞状态的进程也会排成一个队列,可能还会根据不同的阻塞原因排成多个队列。
IPC几种通信方式
-
为什么要进行进程间的通讯(IPC (Inter-process communication)):
- 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间
- 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
-
linux常用的进程间的通讯方式
- 管道(pipe):管道可用于具有亲缘关系的进程间的通信,是一种半双工的方式,数据只能单向流动,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
- 命名管道(named pipe):命名管道克服了管道没有名字的限制,同时除了具有管道的功能外(也是半双工),它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。
- 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事件发生了,除了进程间通信外,进程还可以发送信号给进程本身。
- 消息队列:消息队列是消息的链接表。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 内存映射:内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
- 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
什么是虚拟内存
虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。
虚拟地址、逻辑地址、线性地址、物理地址的区别
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。
线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。
物理地址(Physical Address) 是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。
Java的一些建议
- 覆写equals方法必须覆写hashCode方法。在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。如果两个对象通过equals方法比较得到的结果是相等的,那么对这两个对象进行hashCode得到的值应该相同。
- 运行在多线程的环境中,考虑使用StringBuffer。
面试心得与总结—BAT、网易、蘑菇街
windows内存管理的机制以及优缺点
【操作系统】进程管理(二)
IPC通信的几种方式
操作系统 内存地址(逻辑地址、线性地址、物理地址)概念
OSI和TCP/IP的区别
TCP和UDP之间的区别
计算机网络 之 TCP协议报文结构
TCP/IP常见问题总结(一)
TCP的三次握手与四次挥手过程介绍
TCP/IP常见问题总结(二)
HTTP请求报文和HTTP响应报文
TCP/IP常见问题总结(三)
TCP/IP常见问题总结(四)