1、OSI七层模型和TCP/IP模型, 都有哪些协议?
OSI七层网络模型 | Linux TCP/IP四层概念模型 | 对应网络协议 |
应用层(Application) | 应用层 | TFTP, FTP, NFS, WAIS |
表示层(Presentation) | Telnet, Rlogin, SNMP, Gopher | |
会话层(Session) | SMTP, DNS | |
传输层(Transport) | 传输层 | TCP, UDP |
网络层(Network) | 网络互连层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 网络接口层(主机到网络层) | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。
传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。
2、TCP如何保证可靠传输?
1、将数据截断为合理的长度:应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。
2、校验和: 用以判断数据是否损坏
3、确认应答:当TCP收到发自TCP连接另一端的数据,它将发送一个确认ACK。这个确认不是立即发送,通常将推迟几分之一秒 。(之所以推迟,可能是要对包做完整校验)
4、序列号:按顺序给发送数据的每一个字节都标上号码的编号。接收端查询数据TCP首部中的序列号和数据的长度,将自己下一步应该接受的序号作为确认应答反送回去。
5、超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
6、连接管理:TCP是面向有连接的通信传输,一个连接的建立和断开,正常过程至少需要来回发送7个包。
7、流控制: TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。发送端发送数据不会超过限度。
8、对失序数据进行重新排序,然后才交给应用层
3、滑动窗口算法与回退N帧协议
动窗口协议,也称为回退N步协议中,允许发送方发送多个分组(当有多个分组可用时)而不需等待确认,滑动窗口协议是TCP使用的一种流量控制方法,此协议能够加速数据的传输。
只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。 收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。
当发送窗口大于1,接收窗口等于1时,就是回退N步协议。
当发送窗口和接收窗口的大小均大于1时,就是选择重发协议。
协议中规定,对于窗口内未经确认的分组需要重传。这种分组的数量最多可以等于发送窗口的大小,即滑动窗口的大小n减去1(因为发送窗口不可能大于(n-1),起码接收窗口要大于等于1)。
(1)窗口机制:假设发送窗口尺寸为2,接收窗口尺寸为1
(2)停止等待协议:该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认返回后才能继续发送下一帧
后退N协议:发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧
4、TCP报文格式
端口用来标识同一台计算机的不同进程
序列号是该报文段首字节的字节流编号x。
确定号指定下一个期待的字节x+1
HLEN首部长度这4个字段指出TCP
首部一共有多少个4字节字5*4~15*4
控制位:URG紧急指针有效,ACK确认时
有效的,PSH请求推送,RST连接复位,
SYN同步序号,FIN终止连接
窗口大小: 发送TCP的窗口大小,以
字节为单位,2^16=65535字节,通常被称为接收窗口( rwnd),由接收方决定
校验和: 强制性的, 计算校验和时报文段要附加伪首部
5、TCP三次握手过程
TCP建立连接三次握手, 以及关闭链接的四次握手
(1)客户端将标志位SYN=1,seq=x,将该数据包发送给服务器端,客户端进入SYN-SEND状态,等待服务器端确认
(2)服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN,ACK=1, ack=x+1,seq=y,将数据包发送给客户端, 服务器端状态变为SYN-RCVD
(3)客户端接收到数据包后,检查ack=x+1,ACK=1,正确则将ACK=1,ack=y+1,将数据包发送给服务器端,服务器端检查ack=y+1,ACK=1,正确则建立链接,客户端和服务器端进入ESTABLISED状态。四次挥手,即终止TCP连接,断开一个连接时需要发送四个包来确认链接的断开。TIME-WAIT,超时时间是最大报文段寿命( MSL, 常用30~60s) 的2
6、为什么TCP连接需要三次握手,两次不可以吗?为什么?
为了防止已失效的连接的连接请求报文段又突然传送到服务器端,因而产生错误。
例子:客户端发出的第一个连接请求报文并没有丢失,而是在某个网络节点长时间的滞留,延误到连接释放以后的某一时间才到达server。server接收到失效的报文后, 误以为是client再次发送的请求,于是向client发出确认报文,如果两次握手,只要server确认,新的连接就建立了,并一直等待client发送数据,server
7、如果客户端不断发送请求连接会怎样?
SYN攻击:客户端在短时间内伪造大量不存在的IP地址,向服务器端不断的发送SYN包,服务器端回复确认包,并等待客户端的确认,由于源地址不存在,服务器端不断重发至超时,伪造的SYN包长时间占用未连接队列,导致正常的SYN包因为队列满而被丢弃。典型的DOS攻击,检测到服务器端上有大量半连接状态且源IP是随机的,确认遭到SYN攻击。
DDos预防( 没有根治方法, 除非不用TCP/IP链接)
确保服务器的系统文件是最新版本, 并即时更新系统补丁
关闭不必要的服务
限制同时打开SYN的半链接数目
缩短SYN半链接的time out时间
正确设置防火墙
禁止对主机的非开放服务的访问
限制特定IP短地址的访问
启用防火墙的放DDOS的属性
认真检查网络设备和主机/
8、TCP和UDP的区别?如何改进TCP?
TCP和UDP的区别:
TCP是面向有连接的传输层协议;每条TCP链接是点对点(一对一);保证两端通信主机之间的通信可达;全双工通信;面向字节流;首部最低20个字节
UDP是面向无连接的传输层协议;支持一对一、一对多、多对一、多对多的交互通信;不保证可靠交付,也不使用拥塞控制;面向报文的,没有拥塞控制,适合多媒体通信的要求;首部开销小8字节。
TCP加快传输效率的方法:
采取一块确认的机制
9、TCP的拥塞控制
发送方的窗口大小是由接收方的可用缓存空间(rwnd)来决定的,拥塞窗口大小(cwnd),真正的窗口大小=min(rwnd,cwnd)。
拥塞策略:慢开始(指数增大)
不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。拥塞窗口大小(cwnd)从1个最大报文段的长度开始(1MSS),每当1个报文段被确认,拥塞窗口就+1MSS
当cwnd<ssthresh时,
使用慢开始算法。
当cwnd>ssthresh时,
改用拥塞避免算法。
当cwnd=ssthresh时,
慢开始与拥塞避免算法任意。
拥塞避免(加法增大)
加法增大,直到检测到拥塞为止当
拥塞窗口达到慢开始的门限时(此
时cwnd=i),慢开始停止,加法阶
段开始,每当一整个窗口中的报文
被确认后, 拥塞窗口大小( cwnd) +1MSS
拥塞检测
乘法减小
①计时器超时, 出现拥塞可能性很大
把门限制设置为当前窗口大小的一半
把cwnd重新值为1MSS
再次从慢开始阶段开始
②收到了三个重复的ACK, 出现拥塞的可能性较小
把门限值设置为当前窗口值的一半
把cwnd设为门限值
启动拥塞避免阶段
10、从输入网址到获得页面的过程
(1)查询DNS, 获取域名对应的IP地址
浏览器搜索自身的DNS缓存
搜索操作系统的DNS缓存
读取本地的HOST文件, 路由器缓存
发起一个DNS的系统调用:宽带运营服务器查看本身缓存;运营商服务器发起一个迭代DNS解析请求
(2)浏览器获得域名对应的IP地址后,发起三次握手
(3)TCP/IP连接建立起来之后,浏览器可以向服务器发送HTTP请求
(4)服务器接受这个请求之后,根据路径参数,经过后端的一些处理生成HTML页面代码返回给浏览器
(5) 浏览器拿到完整的HTML页面代码开始解析和渲染, 如果遇到引用的外部CSS/JS/图片等静态资源, 同样是一个个HTTP请求,完成上述步骤
(6)浏览器根据拿到的资源对页面进行渲染, 最终把一个完整的页面呈现给用户
11、http和https的区别
(1)http运行在TCP之上,通信使用明文(不加密),内容可能被窃听;客户端和服务端都无法验证对方的身份,因此有可能遭遇伪装;无法证明报文的完整性,有可能已遭篡改
(2)http和SSL( securesocket layer安全套接层) /TLS( transport layer security安全层传输协议) 组合使用,http就拥有了https的加密、证书、完整性保护。
(3)http直接和TCP通信;当使用SSL时,变成先和SSL通信,再由SSL和TCP通信
(4)https采用共享秘钥加密和公开密钥加密两者混合加密机制: 在交换密钥环节使用公开密钥加密方式,之后建立通信交换报文阶段使用共享秘钥加密方式
数字认证机构( CA) 的业务流程
12、HTTP报文结构
HTTP报文是面向文本的,有两类报文:请求报文和响应报文。
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
图1请求报文 图2响应报文
请求行:由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,用空格分隔。例如GET/index.htmlHTTP/1.1。HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
状态行:由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔
状态码 | 说明 |
200 | 响应成功 |
302 | 跳转,跳转地址通过响应头中的Location属性指定(JSP中Forward和Redirect之间的区别) |
400 | 客户端请求有语法错误,不能被服务器识别 |
403 | 服务器接收到请求,但是拒绝提供服务(认证失败) |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
13、HTTP1.1和HTTP1.0的区别
(1)HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接, 服务器不跟踪每个客户也不记录过去的请求。
(2)HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输, 但每个单独的网页文件的请求和应答仍然需要使用各自的连接。 HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
(3)HTTP 1.0不支持Host请求头字段。 WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点
(4)HTTP 1.1中增加Host请求头字段后, WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点, 这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。
(5)HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头
14、HTTP怎么处理长连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接
如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。如果web服务器端看到这里的值为“Keep-Alive”, 或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length( 返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小,无论客户端浏览器(Internet Explorer) 还是 Web 服务器具有较低的 KeepAlive 值,它都将是限制因素。例如,如果客户端的超时值是两分钟,而Web 服务器的超时值是一分钟,则最大超时值是一分钟。客户端或服务器都可以是限制因素
在header中加入 --Connection:keep-alive
在HTTp协议请求和响应中加入这条就能维持长连接。
再封装HTTP消息数据体的消息应用就显的非常简单易用
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
通常的短连接操作步骤是:
连接-》 数据传输-》 关闭连接;
而长连接通常就是:
连接-》 数据传输-》 保持连接-》 数据传输-》 保持连接-》 …………-》 关闭连接
长连接使用时机:
操作频繁,点对点通讯,而且连接次数不能太多;数据库使用长连接
短链接使用时机:
Web网站的http服务一般使用短链接
15、cookie和session的作用与原理,区别
(1)存取方式不同:
cookie只能保存ASCII字符串,如果需要存取unicode字符或二进制数据,需要进行UTF-8/GBK/BASE64等方式的编码; cookie不能直接存取Java对象session中可以存取任何类型的数据,可以把session看作一个Java容器
(2)从隐私安全上不同:
cookie存储在客户端浏览器中,对客户端可见,客户端的程序可能会窥探、复制、修改cookie中的内容。session存储在服务器端,对客户端透明
(3)有效期上不同:
cookie设置maxAge属性,长期有效;session依赖于名为JSESSIONID的cookie,该cookie的maxAge为-1, 关闭浏览器就失效,不能实现永久有效,使用URL地址重写也不能实现。
(4)对服务器的负担:
session保存在服务器端,每个用户会产生一个session,如果并发用户很多,消耗大量的内存
cookie保存在客户端,不占用服务器资源。
(5)跨域名比较:
cookie支持跨域名访问,domain属性session,session不支持
cookie:
一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。浏览器再次请求该网站时,浏览器把请求的网址连同cookie一同提交给服务器。 服务器检查cookie以此来辨认用户的状态。服务器还可以修改cookie的内容。cookie对象使用key-value属性对的形式保存用户状态,一个cookie对象保存一个属性对,一个request或者response同时使用多个cookie。cookie类位于javax.servlet.http.*下面。cookie不可跨域名中文属于unicode 字符,占四个字符;英文属于ASCII编码, 占2个字符。 cookie使用unicode字符时需要对unicode字符进行编码,否则会乱码
cookie的删除和修改(除value和maxAge外的属性都要与原来的相同)
修改,新建同名的cookie,添加到response中覆盖
删除,新建同名的cookie,maxAge设为0,添加到response中覆盖
案例:永久登录
用户名和密码保存在cookie中,下次访问时检查cookie中的用户名和密码 与数据库相比较。比较危险密码加密后保存到cookie,下次访问先解密再与数据库比较。把登录时间戳保存在cookie与数据库中, 下次访问只需要验证用户名和时间戳就行
session
客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。下次访问只需要从该session中查找该客户的状态即可。javax.sevlet.http.HttpSession。 每个来访者对应一个session对象, 所有该客户的状态信息都保存在这个session对象中。key-value的属性对各客户的session彼此独立,互不可见session的使用比cookie方便。但是过多的session存储在服务器内存中,会对服务器造成压力。
session在用户第一次访问服务器时自动创建放在内存中 只有访问JSPservlet等程序时才会创
建session 每访问一次服务器,session“活跃”一次超时则删除,防止内存溢出
session需要使用cookie作为识别标志。 http是无状态的, session不能依据HTTP连接来判断是否为
同一用户,因此服务器向客户端浏览器发送一个名为JSESSIONID的cookie, 它的值为session的
id, 依据该cookie来判断是否为同一用户。
URL地址重写: 客户端不支持cookie的方案。 将该用户session的id信息重写到URL地址中。
HttpSevletResponse类提供了encodeURL()实现URL地址重写。 response.encodeURL("index.jsp?
c=1&wd=Java")会自动判断客户端是否支持cookie,不支持则将session的id重写到URL中。
16、GET和POST的区别
(1)get是从服务器上获取数据, post是向服务器传送数据。
(2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应, 在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。 用户看不到这个过程。
(3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式 服务器端用
Request.Form获取提交的数据。
(4)get传送的数据量较小,不能大于2KB。 post传送的数据量较大,一般被默认为不受限制。 但理论上, IIS4中最大量为80KB, IIS5中为100KB。get安全性非常低, post安全性较高。但是执行效率却比Post方法好。
建议:
get方式的安全性较Post方式要差些, 包含机密信息的话, 建议用Post数据提交方式;
在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post
17、PING的整个过程, ICMP报文是什么?
18、C/S模式下的socket通信, 几个关键函数
19、路由器与交换机的区别
交换机用来共享一根网线, 路由器用来共享一个IP
(1)层次不同:
交换机在OSI结构的数据链路层,根据数据帧的内容转发数据给相邻的其他网络,可以检查帧中的MAC地址;路由器(3层交换机),网络层面,检查网络层地址(IP层中的地址)
(2)回路:
根据交换机地址学习和站表建立算法,交换机之间不允许存在回路。一旦存在回路必须启动生成
树算法,阻塞掉产生回路的端口。而路由器的路由协议没有这个问题,路由器之间可以有多条通路来平衡负载,提高可靠性。
(3)子网划分:
交换机只能识别MAC地址。MAC地址是物理地址,而且采用平坦的地址结构,因此不能根据MAC地址来划分子网。而路由器识别IP地址,IP地址由网络管理员分配,是逻辑地址且IP地址具有层次结构,被划分成网络号和主机号,可以非常方便地用于划分子网,路由器的主要功能就是用于连接不同的网络
(4)负载集中:
交换机之间只能有一条通路,使得信息集中在一条通信链路上,不能进行动态分配,以平衡负载。而路由器的路由协议算法可以避免这一点,OSPF路由协议算法不但能产生多条路由,而且能为不同的网络应用选择各自不同的最佳路由
20、http和socket的区别,两个协议哪个更高效一点?
http:
超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议。TCP/IP协议
是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据。HTTP协议详细规定了浏览器与服务器之间相互通信的规则,是万维网交换信息的基础。 HTTP是基于请求-响应形式并且是短连接, 并且是无状态的协议。 针对其无状态特性, 在实际应用中又需要有状态的形式,因此一般会通过session/cookie技术来解决此问题。
socket:
Socket不属于协议范畴,而是一个调用接口(API),Socket是对TCP/IP协议的封装,通过调用Socket, 才能使用TCP/IP协议。Socket连接是长连接,理论上客户端和服务器端一旦建立连接将不会主动断开此连接。Socket连接属于请求-响应形式,服务端可主动将消息推送给客户端。
区别:
(1)TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如
何包装数据
(2)由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。Socket连接,服务器就可以直接将数据传送给客户端
(3)而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。