考察重点一:TCP/IP
1. 概念:又叫做TCP/IP协议族(绝不仅仅是与TCP,IP相关的协议)。分为5层,从上到下分别是应用层,传输层,网络层,链路层和物理层。
2.TCP的三次握手与四次挥手(重中之重):
1)TCP简介:面向连接的,可靠的,基于字节流的传输层协议。
2)TCP报文头:
端口号(Port):用来识别不同应用进程(其中0-1023端口属于公认端口,绑定部分服务),收到服务请求是看,动态分配端口号,分为源端口和目的端口(都是2byte/16bit)。所以可通过IP地址+协议+端口号(套接字socket)来唯一标识一个通信进程。
顺序号(Sequence Number/Seq):用来标识从TCP源端向TCP目标端发送的报文中是数据字节流,它表示在这个报文段中的第一个数据字节所处的序号。(4byte/32bit)
确认号(ACK):ACK标志为1时,确认号字段有效。它表示目标端所期望收到下一个数据字节流中的首个数据字节。(4byte/32bit)
头部长度偏移量(Offset):给出头部占32比特的数目。因为任选字段可变。如果没有任何选项字段,TCP头部长度为20字节(2+2+4+4+1+1+2+2+2);最多可以有60字节的TCP头部。(1byte/4bit)
标志位字段(TCP Flags)(U、A、P、R、S、F):各比特的含义如下(6bit):
URG:紧急指针(urgent pointer)有效。(1bit)
ACK:确认序号(acknowledgement )有效。(1bit)
PSH:传送(push)接收方应该尽快将这个报文段交给应用层。(1bit)
RST:(reset) 重建连接。(1bit)
SYN:(synchronous)同步序号,发起一个连接,用于建立连接过程。(1bit)
FIN:(finish结束)释放一个连接。(1bit)
窗口(Window):此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。(2byte/16bit)
校验和(Checksum):占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。(4byte/16bit)
紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。(16bit)
选项和填充:可能包括"窗口扩大因子"、"时间"等选项。(32bit)
3)TCP三次握手过程:
建立连接时,虽然不发送数据,但是依旧会占据一个序列位置,所以ack=x+1;
具体流程如下:
1.第一次握手:A -> B;客户端A发送SYN包(SYN=1,seq=x)给服务器B,A进入SYN-REVD(同步接收)状态,等到B确认;
2. 第二次握手:B ->A;B接收到A的SYN包,必须确认客户的SYN(ack=x+1);同时发送自己的SYN包(SYN=1,seq=y)和ACK包(ACK=1,ack=x+1),B进入SYN_REVD状态。
3.第三次握手:A收到B的SYN+ACK包后,再向B发送ACK(ACK=1,seq=x+1,ack=y+1),A发送完毕,B接收此ACK包后,A,B进入ESTABLISHED状态。三次握手过程结束。
为什么需要三次握手才能建立起连接?
为了初始化Sequence Number的初始值;TCP会用seq来拼接数据,保证数据在网络传输中不会乱序。
第三次握手发送ACK报文:告知服务器B已接收到B的seq。
首次握手的隐患 -- SYN超时:
起因:服务器已发出SYN+ACK,但未能收到客户端的ACK确认包;
Service会重发SYN+ACK5次,每次j间隔时间翻倍(从1s开始),Linux默认等待63s(1+2+4+8+16+32)后断开连接;
导致的风险:SYN Flood(SYN泛洪)
防护措施:回发SYN cookie(利用A的SYN包计算出一个特定的cookie,不专门分配数据区间),可绕过满的SYN队列;
保活机制:
1.按照特定的时间间隔发送保活探测报文,未响应继续发送;
2. 发送保活探测数达到阈值,则中断连接。
4)TCP 四次挥手
本质:实质上是客户端A与服务器B分别进行两次挥手(FIN与ACK);
注意客户机A和服务器B状态的转变。
为什么需要等待2MSL(报文最大生存时间)?
1. 确保有足够的时间让B收到ACK包
2.避免新旧连接混淆(因为路由会缓存之前的IP包)
服务器出现大量的CLOSE_WAIT状态发原因:没有及时关闭连接
措施:检查代码,特别是释放资源的代码;
检查配置,特别是处理请求的线程配置
UDP与TCP的区别:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠(因为确认重传机制)的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP的滑动窗口:(发送滑动窗口和接收滑动窗口)GBN+选择重传(后退N步协议)
RTT(Round Trip Time):一个数据包从发送到收到ACK所花费的时间。
RTO(Retransmission Time Out):重传超时时间
作用:流量控制(window:接收方还剩余多少缓冲区可以使用)与乱序重排
GBN+选择重传
区别:
1.GBN在2出错后,要将之后所有已发送但还没收到确认的分组重传(不管是否正确传输);SR则只需传输出错的分组。
2.确认(ACK):在GBN中确认值(ACK) 是累计的,它定义了下一个希望接收的分组序号,同时也证实了此前所有的分组都已经被完好的接收了.在SR中,确认号(ACK)只定义完好接收的那一个分组的序号,并不反馈任何其他分组的信息.
3.计时器:GBN将所有的分组当做一个整体对待,而选择重传协议则分别对待每一个分组。但是大多数SR的运输层仅使用了一个计时器. 注意只使用一个计时器而做到跟踪所有发出去的分组的情况的做法是:标记发出分组,当ACK=Sf 时,将窗口滑过所有连续的已确认的分组,如果还有未确认的分组,则重发所有检测到的未被确认的分组并重启计时器,如果所有分组都被确认了则停止计时器.
考察重点二:HTTP(超文本传输协议)
1. GET和POST请求
三个层次:
Http报文层次:GET把参数包含在URL中,POST通过request body报文体传递参数。
数据库层次:GET符合幂等性和安全性(不修改数据),POST不符合。
其他层次:GET可以被缓存存储,POST不行。
2.Cookie和Session机制的区别:(保存一个标识)
1. 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
session机制可能需要借助于cookie机制(默认)或URL回写来达到保存标识的目的。
2.会话cookie和持久cookie的区别
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
3.实现自动登录
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源
4.如何根据用户的爱好定制站点
网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。
5.session机制:session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。、
6.保存session id的几种方式
A.采用cookie(默认);
B.URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
7. URL重写有什么缺点
对所有的URL要使用URL重写,都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或 JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION_ID已经过期了。
8.使用隐藏的表单域有什么缺点
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程
9. session什么时候被创建
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
10. session何时被删除?
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
3. SSL(安全套接层)--HTTP与HTTPS的区别之处
其中SSL3.0更名为TLS(安全传输层协议),采用身份验证和数据加密保证网络通信的安全和数据的完整性
4.Socket 套接字
Socket是对TCP/IP协议的抽象,方便程序员使用TCP/IP协议栈,是一个开放的接口。