TCP/IP

Tcp 通过下列方式提供可靠性:

tcp 是面向连接,可靠的字节流服务。

字节流服务:两个应用程序通过tcp 连接,tcp 不在字节中插入记录标识符,我们将这种为字节流服务。

1)将应用数据分割为tcp 认为最合适发送的数据块;

2)超时重传:当tcp 发出一个段后,他启动一个定时器,等待目的端确认收到这个报文段。若不能及时收到一个确认,将重发这个报文段。

3)当tcp 收到发自tcp 链接另一端的数据时,它将发送一个确认(对于收到的请求,给

出确认响应)。这个确认不是立即发送,通常将推迟几分之一秒(之所以推迟,可能是要对包做完校验);

4)若tcp 收到包,校验出包有错,丢弃报文段,不给出响应,tcp 发送端会超时重传;

5)对于失序数据进行重新排序,然后交给应用层(tcp 报文段作为ip 数据报进行传输,而ip 数据报的到达会失序,因此tcp 报文段的到达也可能失序。若必要,tcp 将对收到的数据进行重新排列,以正确的顺序交给应用层)。

6)对于重复数据,直接丢弃。

7)tcp 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出。

Tcp 对字节流的内容不做任何解释,tcp 不知道传输的字节流数据是二进制数据还是 ascii字符或其他类型数据,对字节流的解释由tcp 连接双方的应用层。

https 其实是由两部分组成:http+ssl/tls,也就是在http 上又加了一层处理加密信息的模块,服务端和客户端的信息传输都会通过tls 加密,传输的数据都是加密后的数据。

加解密过程:

1)客户端发起https 请求(就是用户在浏览器里输入一个https 网址,然后连接到server的443 端口)

2)服务端的配置(采用https 协议的服务器必须要有一塔数字证书,可以自己制作,也可以向组织申请,这套证书就是一对公钥和私钥)。

3)传输证书(这个证书就是公钥,只是包含了很多信息)

4)客户端解析证书(由客户端tls 完成,首先验证公钥是否有效,若发现异常,则弹出一个警示框,提示证书存在问题,若无问题,则生成一个随机值,然后用证书对随机值进行加密)

5)传输加密信息(这里传输的是加密后的随机值,目的是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密了)

6)服务端解密信息(服务端用私钥解密后得到了客户端传来的随机值,then 把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全)

7)传输加密的信息

8)客户端解密信息,用随机数来解。


问:在客户端抓包抓到的是加密的还是没加密的?不知道是哪个面试官问的,我就乱说是加密的,然后面试官说错了,是没有加密的

tcp 与udp 的差别在适用性上,并非在与速度上,泛泛地说谁比谁快都是不恰当的。

tcp:http、ftp、pop3、telnet、smtp udp:dns、rip、tftp

使用端口号来区分应用进程。

Tcp 保活功能,主要为服务器应用程序提供,服务器应用程序需要知道客户主机是否崩溃,从而可以代表客户使用资源.tcp 保护功能是探测长连接存活状况。

如果一个给定的连接,在两个小时内没有任何的动作,则服务器就向客户发送一个探测报文段,客户主机必须处于以下四个状态之一:1)客户主机依然正常运行,并从服务器可达,客户的tcp 响应正常,而服务器也知道对方是正常的,服务器在两个小时后将保活定时器复位。2)客户主机已经崩溃,并且关闭或正在重新启动。在任何一种情况下,客户的tcp 都没有响应,服务器不能收到对探测的响应,并在75s 后超时,服务器总共发送10 个这样的探测,每个间隔75s。若服务器没有收到一个响应,他就认为客户主机已经关闭,并终止连接。3)客户主机崩溃并已重新启动,服务器将收到一个对其保活探测的响应,这个效应是一个复位,使得服务器终止这个链接。4)客户机正常运行,但服务器不可达,和2)类似。


Tcp 的keep-alive 是检查当前tcp 是否还活着;http 的keep-alive 是让一个tcp 连接活多久,他们是不同层次的概念。

Tcp:1)流量控制:防止较快主机使较慢主机缓冲区溢出,是点对点;2)拥塞控制:全局性,防止过多的数据注入网络。

tcp 采用滑动窗口进行流量控制,滑动窗口大小可变,窗口大小的单位是字节。

发送窗口在连接建立时由双方确定,但在通信过程中,接收端可以根据自己的资源情况,随时动态的调整对方的发送窗口上限制。

接收端窗口:这是接收端根据其目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。接收端将此窗口值放在tcp 报文的首部中的窗口字段,传送给发送端,是来自接收端的流量控制。


拥塞控制:慢开始、拥塞避免、快重传、快恢复。

慢开始:由小到大逐渐增大发送端的拥塞窗口数值。

拥塞窗口:这是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。

当网络发生拥塞时,路由器就会丢掉分组,因此,只要发送端没有按时收到应当到达的确认报文ack,就可认为网络出现了拥塞。

发送窗口上限=min{接收窗口,拥塞窗口}。


为了防止拥塞,窗口cwnd 的增长引起网络拥塞,还需要慢开始门限ssthresh。

当cwndssthresh, 使用拥塞避免算法;当cwnd=ssthresh,既可用慢开始算法也可用拥塞避免算法。

无论是慢开始还是拥塞避免,只要发送端发现网络阻塞,就将慢开始门限设为出现拥塞时的发送窗口值的一半,然后拥塞窗口为一,并执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

快重传算法规定:发送端只要一连收到三个重复ack,即可断定有分组丢失,就应该立即重传丢失的报文,而不需要等待为该报文设置的重传计时器超时。

与慢开始不同,拥塞窗口不设为1,,而设为慢开始门限+3*mss(mss:最大报文段)。

TCP 和UDP——tcp:面向连接,提供可靠的服务,无重复、无丢失、无差错,面向字节流,只能是点对点,首部20 字节,全双工。

UDP:无连接,尽最大努力交付,面向报文,支持一对一、一对多、多对多,首部8 字节.

怎么用udp 实现tcp:由于在传输层udp 已经是不可靠的,那就要在应用层自己实现一些保证可靠传输的机制,简单来说,要使用udp 来构建可靠的面向连接的数据传输,就要实现类似于tcp 的超时重传(定时器),拥塞控制(滑动窗口),有序接收(添加包序号),应答确认(ack 和seq)。目前已经有了实现udp 可靠运输的机制——udt:主要目的高速广域网海量数据传输,他是应用层协议。


正向代理:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要哪个无法访问的网站的内容,代理服务器取回来给我。server 不知道client。

反向代理:client 不知道server,并不是URL 中请求的那个资源,而是不知道从什么地方来的。以代理服务器来接收internet 上的请求,然后将请求转发给内部网络的服务器,并将从服务器上得到的结果返回给internet 上请求的客户,此时代理服务器对外就表现为一个服务器。1)保证内网安全、2)负载均衡,nginx 通过proxy-pass-http 配置代理站点,upstream 实现负载均衡。

正向代理作用:1)访问原来无法访问的资源。2)可以做缓存,加速访问资源。3)但代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。4)客户端访问权限,上网进行验证。


域名解析过程:1)在浏览器中输入 www.baidu.com,操作系统会先检查自己本地的 hosts文件是否有这个网址映射关系,若有就调用这个ip 地址映射,完成解析。2)若hosts 没有,则找本地dns 缓存。3)若hosts 与本地dns 缓存都没有,则找tcp/ip 参数中设置的首选dns 服务器,在此我们叫它本地dns 服务器,此服务器收到查询时,若要查询的域包含在本地配置资源中,则返回。4)若要查询的域名不是本地dns 解析,但该服务器已经缓存了此网址映射关系,则调用这个ip 地址映射。5)若本地资源和缓存里都没有,则根据本地dns 服务器的设置(是否设置转发器)进行查询--1)未用转发模式,本地dns 把请求发给根dns 服务器, 根dns 收到请求后会判断这个域名是谁来授权管理,则会返回一个负责的顶级域名服务器的ip,本地dns 服务器收到ip 后,将到联系负责.com 的这个服务器,若这台负责.com 的服务器无法解析,则找下一级dns 服务器的ip 给主机,依次下去。2)若用转发方式,dns 服务器就把请求转发给上一级dns 服务器,由上一级服务器进行解析,上一级服务器若不能解析,

再上一级,以此循环。不管转发还是不转发,都把结果给本地dns 服务器,再由本地dns

服务器给客户机。

主机向本地域名服务器查询一般是递归查询,递归查询,就是若主机所询问的本地域名服务器不知道查询域名的ip 地址,则本地域名服务器就以客户的身份向其他根域名服务器发出查询请求,而不是让主机自己进行下一步查询,所以递归查询返回的结果,要么是ip 地址,要么报错。

本地域名服务器向根dns 服务器的查询是迭代查询,当根域名服务器收到本地dns 服务器的请求时,要么返回一个ip,要么告诉本地dns 服务器,你下一步需要向哪一个dns 服务器查询,然后让本地服务器自己查询。

http 请求过程——当我们在浏览器输入 www.baidu.com,然后回车之后的详解。1)域名解析(域名www.baidu.com 变为ip 地址)。2)发起tcp 的三次握手,建立tcp 连接。浏览器会以一个随机端口(1024-65535)向服务端的web 程序80 端口发起tcp 的连接.这个请求(原始的http 请求,经过原始的tcp/ip 四层模型层层封装),到达服务器端后,进入网卡,然后进入内核的协议栈(一层一层拨开),然后到达web 应用程序,最终建立了tcp/ip 链接。3)建立tcp 连接后发起http 请求。4)服务器响应http 请求,客户端得到html 代码。服务器web 应用程序收到http 请求后,就开始处理请求,处理之后就返回给浏览器html 文件。5)浏览器解析html 代码,并请求html 中的资源。6)浏览器对页面进行渲染,并呈现给用户。

https 若在浏览器端抓包,是可以看到数据的,并没有加密,抓到的是加密之前的。

DNS 即使用tcp,又使用udp。

a 发送给b 一个信息,但是a 不承认他发送了,防止这个可用数字签名。

http:一个http 的请求包含三个方面,请求方法-uri-协议/版本,请求头,实体;http

响应也包含三个方面,协议-状态码-描述,响应头,响应实体。

用memoryanalyzer 看OOM。


http 请求报文由请求行请求头部空行和请求数据四部分。请求行:请求方法-url-http 协议版本。请求头:通知服务器有关客户端请求的信息,每行一个键值,键值用“;”分开。 

DNS 劫持:通过某些手段获得某域名的解析控制权,修改此域名的解析结果,导致对该域名的访问由原ip 地址转入到修改后的指定ip。其结果是对特定的网址不能访问或访问的是假网址。


当对网络通讯质量有要求的时候,tcp,QQ 文件;当对网络通讯质量要求不高,udp,

qq 消息。

验证证书是否有效。1)验证证书是否在有效期内:证书中会包含证书的有效期的起始时间和结束时间。2)验证证书是否被吊销。被吊销的证书是无效的,验证吊销有两种:CRL 和OCSP。CRL:吊销证书列表,证书被吊销后会被记录在CRL 中,CA 定期发布CRL,应用程序可以依靠CRL 来验证证书是否被吊销。有两个缺点:1)可能会很大,下载很麻烦。2)有滞后性,就算证书被吊销了,应用也只能等到发布最新的CRL  才能知道。OCSP:在线证书状态检查协议,应用按照标准发送一个请求,对某张证书进行查询,之后服务器返回证书状态。OCSP 可认为是即时的(实际实现中可能有延迟)。3)验证证书上是否有上级CA 签名:每一级证书都是由上一级CA 证书签发的,上级CA 证书还可能有上级,最后会找到根证书,根证书即自签证书,自己签自己。以上三点只要有一个没通过,这张证书就是无效的,不该信任。

数据链路层协议:ppp、cdma/cd。

短链接一般只会在client/server 间传递一次读写操作。

可以把channel 看作io 流,但它和io 流相比还有一些不同:1)channel 是双向的,既可以读又可以写,io 流是单向的;2)channel 可以进行异步读写;3)对channel 的读写必须经过Buffer 对象。

Filechannel :从文件读取数据的。Datagramchannel:读写udp 的网络协议数据。

Socketchannel:读写tcp 网络协议数据。Serversocketchannel:可以监听tcp 连接。

从文件读取数据分三步:1)从FileInputStream 中获取channel;2)创建Buffer;3)从

channel 中读数据到Buffer。通过nio 进行文件复制的代码:

网络编程nio(异步io)异步io 是一种没有阻塞的读写数据的方法。selector 是一个对象,可以注册到很多channel,监听各个channel 上发生的事情,并且能够根据事件情况决定channel 读写,这样通过一个线程管理多个channel,就可以处理大量网络连接。

有了selector,可以用一个线程处理所有channel。线程之间的切换对操作系统来说,代价是很高的,并且每个线程也会占用一定的系统资源,所以对系统来说,线程越少越好(但若CPU 有多个内核,不使用多任务是在浪费CPU 能力)。

1)Selector selector=Selector.open();

2)注册Channel 到selector 上

channle.configureBlocking(false)

SelectionKey key=channel.register(selector, SelectionKey.OP_READ);

注:注册到server 上的channel 必须设置为异步模式,否则异步io 无法工作,这就意味着我们不可以把一个Filechannel 注册到selector 上。因为Filechannel 没有异步模式,但

socketchannel 有异步模式。

register 方法的第二个参数,它是一个“interst set”,意思是注册的 selector 对 channel中的哪些事件感兴趣。事件类型有四种:read、write、connect、accept。通道触发一个事件指该事件已经Ready,所有某个channel 成功连接到另一个服务器称为connect  ready。一个

Serversocketchannel 准备好接收新连接称为connect ready。一个数据可读的通道可以说read

ready。等待写数据的通道write ready。

Write: SelectionKey.OP_WRITE Read: SelectionKey.OP_READ Accept: SelectionKey.OP_ACCEPT Connect: SelectionKey.OP_CONNECT

若对多个事件感兴趣,可写为(用or):

Int interest=SelectionKey.OP_READ|SelectionKey.OP_ACCEPT

SelectionKey 表示通道在selector 上的这个注册,通过SelectionKey 可以得到selector 和注册的channel.selector 感兴趣的事情。

一旦向selector 上注册了一个或多个通道,就可以调用重载的select 方法返回你所感兴趣的事件(比如连接、接受、读、写)已经准备就绪的通道。比如若你对Read Ready 感兴趣,select 方法读事件已经就绪的通道,select 方法返回的int 值,表示有多少通道已经就绪。 Int select():阻塞到至少有一个通道在你注册的事件上就绪;Int select(long timeout):与

select()一样,只是最长只会阻塞timeout ms;Int selectnow(),不阻塞,不管什么通道就绪都立即返回,若自从前一次选择操作后,没有通道变为可选的,则直接返回0。

Buffer 的三个属性:1)capacity:buffer 有一个固定大小,也就是capacity,你只能往里面写capacity 个byte、long、char 等类型;2)position:当你写数据时,position 表示当前位置,即下一个可以开始写的位置。初始时position 为0,当写入一个数据时,position 会向前移动到下一个可插入数据的buffer 中,position 最大为capacity-1;当读数据时,也就是从某个特定位置开始读,应当将position 从写模式切换到读模式,position 被置为0。3)limit:在写模式下,limit 表示你最多能写多少数据,此时limit=capacity;在读模式中,limit 表示你最多能读到多少数据。所以当切换到读模式时,limit 被设置为写模式下position。

Socketchannel:可以通过以下两种方式创建Socketchannel:1)打开一个Socketchannel,

并连到互联网上一台服务器;2)一个新连接到达serverSocketchannel 时,会创建一个

Socketchannel。

打开Socketchannel 方式:1)Socketchannel socketchannel=Socketchannel.open(); socketchannel,connect(new InetSocketAddres(s“www.baidu.com”,80)).关闭 Socketchannel

Socketchannel.close();int eof=Socketchannel.read(ByteBuffer);eof:表示读了多少字节进buffer

中,若为-1,则表示已经读到流的末尾。

ServerSocketchannel serverSocketchannel=ServerSocketchannel.open(); serverSocketchannel.socket().bind(new InetSocketAddress(900));

Io:面向流、阻塞、无选择器;nio:面向缓冲,非阻塞io,有选择器;

一个url 对象,其构造函数new URL(“String s”),比如new URL(“http://www.baidu.com”),该字符串对于的ip 为202.108.33.94,判断URL 对象是否相等:若两个主机名可以解析为同一个ip 地址,则认为两个主机相同,即url 对象相同;若有一个主机名无法解析,但两个主机名相等(不区分大小写),or 两个主机名都为null,则也认为这两个主机相等。

例子:

String[] s={“http://www.baidu.com”,”www.sina.com.cn”,”www.uestc.edu.cn”},他们对象的ip

分别为203.109.00.93 202.108.33.94 203.109.00.93

U1=new URL(s[0]) U2=new URL(s[1]) U3=new URL(s[2])

则 u1.equals(u2)为 false 因为 ip 不同 u1.equals(u3)为 true 因为 ip 相同

Object 的clone 方法public Object clone() throws CloneNotSupportedException 创建并返回此对象的一个副本对于任意对象x,则x.clone()!=x 是true x.clone().getClass()==x.getClass()是

true,这些并非必须满足的条件

首先,若此对象的类不能实现cloneable 接口,则会抛出CloneNotSupportedException (注:

all 数组都被视为实现了cloneable 接口)否则,此方法会创建次对象的类的新实例,严格使用此对象相应字段的内容初始化该对象的all 字段;这些字段的内容没有被自我复制,所以此方法的执行时该对象的“浅表复制”,而不是“深层复制”操作。

Object 类没有实现cloneable 接口,所以在类为Object 的对象上调用clone 方法时会抛出异常。

Cloneable 是一个标记接口。

Web service:是一种跨编程语言和跨操作系统的远程调用技术,就是说服务器采用java 编写,客户端程序可以采用其他编程语言编写,且客户端和服务器程序可以在不同操作系统上运行。

所谓远程调用,就是一台计算机a 上的一个程序可以调用另一台计算机上的一个对象的方法,比如天气预报系统把服务以web service 服务的形式暴露出来,让第三方程序可以调用这些服务功能。

从表面上看,web service 就是一个应用程序向外界暴露出一个能通过web 进行调用的

api;从深层次看,他定义了应用程序如何在web 上实现互操作性,是一套标准。

物理-数据链路-网络-传输-会话-表示-应用。

URL 中可以存在中文吗?

A:可以,先将中文进行编码,tomcat 默认解码为iso8859-1,这样就会出现乱码,我们可以再用iso8859-1 进行编码,再用指定码表解码(post 和get 都可以)。对于post,可以使用

requset 的setCharacterEncodeing 方法设置指定的解码表。

现在需要测试系统的高并发性能,如何模拟高并发?

使用cyclicbarrier,cyclicbarrier 初始化时规定一个数目,then 计算调用了cyclicbarrier.await()

进入等待的线程数,当线程数达到这个数目时,所有进入等待状态的线程将被唤醒并继续。

Cyclic 就像他的名字一样,可看成是一个屏障,所有线程必须到达后才可以一起通过这个屏障。

NAT:网络地址转换,常用于私有地址与公有地址的转换,以解决ip 地址匮乏的问题。

A:1-127 B:128-191 C:192-223

138.96.0.0/16 其中16 表示子网掩码1 的个数,则其子网掩码为225.225.0.0,1 为网络号,

0 为主机号。

在一个ip 数据包到达目的之前,他不可能重组,但是可以分散为碎片。

win2000 os 中1)配置ip 地址的命令是ipconfig2)用ping 来测试本机是否安装了tcp/ip 协议

3)列出本机当前可建立的链接netStat-a

ping 基于什么协议?答案:icmp,是tcp/ip 协议族的额自协议,在网络层,用于在ip 主机、路由器之间传输控制消息。控制消息是指网络通不通,主机是否可达、路由是否可用等网络本身的消息。这些控制信息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。Ping,tracert 都是基于icmp。可以利用os 规定的icmp 数据包的最大尺寸不超过

64k,向主句发起ping of deathgongji 该攻击原理:若icmp 数据包的尺寸超过64k 上限,主机就会出现内存分配错误导致tcp/ip 堆栈奔溃,致使主机死机。防范方法:1)在路由器上对icmp 数据包进行带宽限制,将icmp 占用的带宽控制在一定的范围,这样即使有icmp 攻击,他所占用的带宽也非常有限。2)在主机上限制,设置icmp 数据包的处理规则,最好是设定拒绝all 的icmp 数据包。

每经过一个路由器,ttl 减1,到0 时丢弃。

应用网关1)可以是一个代理服务器2)可以被用来链接公司内部网络应用和公司外部网络应用3)可以是防火器构造的一部分。

0 和127 不作为A 类地址。子网掩码只有一个作用,就是将某个ip 地址划分为网络地址和主机地址两部分。两台计算机各自的ip 地址和子网掩码进行与操作运算后,若得出相同结果,则说明这两台计算机处于同一个子网中。

1)使用usb2.0 闪存盘,往usb 闪存盘上拷贝文件的数据传输效率。2)使用100Mb/s 以太网,在局域网内拷贝大文件时网络的传输效率。3)使用一辆卡车拉1000 块单块1TB 装满数据的硬盘,以100km/h 的速度从北京到天(100km)一趟所等价的数据传输宽带。4)使用电脑播放MP3,电脑的pci 总线到声卡的数据传输速率传输速率排行:4<1<2<3 普通

U  盘写数据约为6MB/s=48Mb/s;100Mb  以太网的速率为100Mb/s; 卡车拉硬盘

1000*1000*B/3600=2222Mb/s;MP3 在256kb/s 码率下也有平均只有1min2MB ,所以约

0.3Mb/s.

History 对象是包含用户访问过的URL,是Window 对象的一部分,他的几个方法1)

length:返回浏览器历史列表中的URL 数量。2)back:加载history 列表中的前一个URL。3)

forward:加载history 列表中的下一个URL。4)go:加载history 列表中的某个具体页面。

超链接的下划线默认是有的,去掉的方法是a{text-decoration:none}

简单网络管理协议SNMP 协议的组成部分:SNMP 本身+管理信息结构SMI+管理信息库

MIB,SNMP 报文组成部分:版本+首部+安全参数+SNMP 报文的数据部分。

Dhcp 向服务器要ip 地址

发现阶段:dhcp Client 寻找 dhcp 服务器的过程,收到 discovery 的 server 都会回复。Offer:表示该服务器可以给他提供ip 地址。Request:客户端选择一个server 来要ip。Ack:把ip 给客户端。


FTP 端口 20:传输数据 21:传输控制信息。

DNS 服务中资源记录类型PTR A CNAME

中断方式一般用于处理随机出现的服务请求。DMA 方式数据传送不需要cpu 控制。DMA 和cpu 必须同时使用总线。

SMTP:邮件服务器之间传递报文。Mac 48bit ipv4:32 ipv6:128

BGP 是在自治系统之间的路由协议,当前英特网路由选择协议分为内部网关协议和外部网关协议。

许可协议:许可的目的是向使用你产品的人提供一定的权限,常见协议有BSD、Apache

license 、GPL、LGPL。

当用n 比特进行分组编号时,若接受窗口为1(即只能按序接受分组),那么若要求连续arq 协议能正常运行时,发送窗口大小不超过2n-1.

曼切斯特编码。从低到高表示1,从高到低表示0,使用他的目的是实现对通道过程中收发双方的数据同步。

Location 和history 对象和浏览器列表有关。

Padding 透明且可以显示背景。

DNS 区域配置文件,默认有localhost.zone 和named.local

INetAddress:表示互联网or  局域网一台主机的地址。Tcp serverSocket 和 socket 类 UDP datagramSocket 和 datagramPacket 类

Where liename is null Where liename is not null

你可能感兴趣的:(TCP/IP)