目录
一、计算机网络
1.分层模型
2.传输层(提供端到端的交换数据的机制)
(1)TCP与UDP的区别
TCP:有连接,面向字节流,速度慢,有拥塞控制,可靠 (校验码、超时重传、确认应答与***、流量控制)
UDP:无连接,面向报文,速度快,无拥塞控制,适合实时应用,不可靠
(2)TCP与UDP的应用场景
若通信数据完整性需让位与通信实时性,则应该选用 TCP 协议(如文件传输、重要状态的更新等);
反之,则使用 UDP 协议(如视频传输、实时通信,如流媒体、QQ等)。
(3)TCP三次握手
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。
1)为什么不能用两次握手进行连接?
两次握手可能发生死锁。
假定A给B发送一个连接请求分组B收到了这个分组,并发送了确认应答分组。按照两次握手的协定,B认为连接已经成功地建立了,可以开始发送数据分组。可是,当B给A的应答分组在传输中被丢失(第二步),将不知道B是否已准备好,不知道B建立什么样的***,A甚至怀疑B是否收到自己的连接请求分组。在这种情况下,A认为连接还未建立成功,将忽略B发来的任何数据分组,只等待连接确认应答分组。这样就形成了死锁。
如果是三次握手,当B给A的应答分组在传输中被丢失,A无法进行第三步,则B将重传应答分组给A,直到建立连接
2)三次握手建立连接时,发送方再次发送确认的必要性?
主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。
假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后才到达B。本来这是一个早已失效的报文段,但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多资源就这样白白浪费了。
而当有第三步发送方再次确认这一步存在,当A收到B的确认报文,因为AB连接已经关闭了,A只能接受请求报文不会接受确认报文,所以他不会进行第三步的确认,所以不会建立新的连接。
(4)TCP四次挥手
1)为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
建关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了。
2)四次挥手释放连接时,等待2MSL的意义?
第一,保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK 报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收。
第二,防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
(5)流量控制和拥塞控制
A.流量控制
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。
利用滑动窗口机制实现的,接收方在返回的ACK中会包含自己的接收窗口的大小,以控制发送方的数据发送。
B.拥塞控制
防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
慢开始和拥塞避免
当 cwnd < ssthresh 时,使用上述的慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
快重传和快恢复
快重传:如果发送端接收到3个以上的重复ACK(超时,说明此时网络发生拥塞了),不需要等到重传定时器溢出就重新传递,把慢开始门限减为当前cwnd的一半
快恢复:把cwnd值设置为门限ssthresh减半后的数值,执行拥塞避免算法,线性增长
区别:
流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理,是发送端和接收端之间点到点之间的控制 ;
拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理,是一个全局性的过程;
3.网络层
主要负责寻找地址和路由选择,网络层还可以实现拥塞控制、网际互连等功能,下图为IP地址分类。
(1)ICMP控制报文协议
用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ping底层就使用的ICMP协议,跟踪路由的Tracert命令也是。
(2)ARP协议
根据IP地址获取物理地址。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。
ARP攻击:ARP协议通过广播方式获取IP地址和MAC地址的对应关系,是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。
(3)路由器和交换机的区别
路由器:寻址,转发(依靠 IP 地址) ,工作在网络层
交换机:过滤,转发(依靠 MAC 地址),工作在链路层
4.应用层
为应用程序提供服务并规定应用程序中通信相关的细节
(1)超文本传输协议HTTP与HTTPS
HTTP:最基本的客户机/服务器的访问协议;浏览器向服务器发送请求,而服务器回应相应的网页。HTTP协议以明文方式发送内容,不提供任何方式的数据加密。
HTTPS:HTTP的安全版,加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
SSL四次握手
- 客户端请求建立SSL链接,并向服务端发送一个随机数A和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。
- 服务端回复一种客户端支持的加密方法、一个随机数B、授信的服务器证书和非对称加密的公钥。
- 客户端收到服务端的回复后利用服务端的公钥,加上新的随机数C通过服务端下发的公钥及加密方法进行加密,发送给服务器。
- 服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用随机数ABC通过一定的算法生成HTTP链接数据传输的对称加密key – session key。
此后的HTTP链接数据传输即通过对称加密方式进行加密传输。
状态码:
2XX:操作成功,如200("OK")
3XX:重定向,通常告诉客户端需要向另一个URI发送GET请求,才能得到所需的表示。
4XX:客户端错误,客户端所请求的URI不对应于任何资源。
404("Not Found")用于服务器端不知道客户端要请求哪个资源;
410("Gone")用于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了。
5XX:服务端错误
502("Bad Gateway")表明代理方面出现问题,或者代理与上行服务器之间出现问题,而不是上行服务器本身有问题。
若代理根本无法访问上行服务器,响应代码将是504("Gateway Timeout")。
(2)DNS域名解析协议
DNS是一种用以将域名转换为IP地址的Internet服务
寻址方式
递归查询:主机向本地域名服务器的查询一般都是采用递归查询。
如果主机所查询的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询的请求报文(即替该主机继续查询)
迭代查询:本地域名服务器向根域名服务器查询通常是采用迭代查询。
当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”,然后让本地域名服务器进行后续的查询。
(3)简单邮件传送协议SMTP
Client/Server模式,面向连接
基本功能:写信、传送、报告传送情况、显示信件、接收方处理信件
(4)文件传送协议FTP
提供交互式的访问,基于客户服务器模式,面向连接使用TCP可靠的运输服务
主要功能:减少/消除不同操作系统下文件的不兼容性
(5)远程登录协议TELNET
客户服务器模式,能适应许多计算机和操作系统的差异,网络虚拟终端NVT的意义
二、JAVA网络编程
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。一个Socket由一个IP地址和一个端口号唯一确定。
通常我们在说到网络编程时默认是指TCP编程,即用socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。SOCK_STREAM是面向连接的,也是双向的。而SOCK_DGRAM是UDP的网络通讯。
1.TCP网络编程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
2.UDP网络编程
UDP编程的服务器端一般步骤是: (无listen和accept函数)
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;