已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
传输协议TCP/IP三次握手,建立连接四次挥手,断开连接层次结构TCP/IPOSI应用层应用层表示层会话层主机到主机层(TCP)(又称传输层)传输层网络层(IP)(又称互联层)网络层网络接口层(又称链路层)数据链路层物理层TCP三次握手所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。 第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。 第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。 第三次握手.客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1SYN攻击 在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态. Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。 Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击netstat -n -p TCP | grep SYN_RECV一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.但是不能完全防范syn攻击。TCP 四次挥手TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。参见wireshark抓包,实测的抓包结果并没有严格按挥手时序。我估计是时间间隔太短造成。UDPTCP/IP与UDP区别TCP/IP协议时面向连接,UDP面向非连接TCP/IP编程ServerSocket,SocketHttp详解HTTP协议详解之请求篇 http请求由三部分组成,分别是:请求行、消息报头、请求正文1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。请求方法(所有方法全为大写)有多种,各个方法的解释如下:GET 请求获取Request-URI所标识的资源POST 在Request-URI所标识的资源后附加新的数据HEAD 请求获取由Request-URI所标识的资源的响应消息报头PUT 请求服务器存储一个资源,并用Request-URI作为其标识DELETE 请求服务器删除Request-URI所标识的资源TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT 保留将来使用OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求应用举例:GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。eg:POST /reg.jsp HTTP/ (CRLF)Accept:image/gif,image/x-xbit,. (CRLF).HOST: (CRLF)Content-Length:22 (CRLF)Connection:Keep-Alive (CRLF)Cache-Control:no-cache (CRLF)(CRLF) /该CRLF表示消息报头已经结束,在此之前为消息报头user=jeffrey&pwd=1234 /此行以下为提交的数据HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来 说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识 的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。2、请求报头后述3、请求正文(略) HTTP详解之响应篇 在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文1、状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:1xx:指示信息-表示请求已接收,继续处理2xx:成功-表示请求已被成功接收、理解、接受3xx:重定向-要完成请求必须进行更进一步的操作4xx:客户端错误-请求有语法错误或请求无法实现5xx:服务器端错误-服务器未能实现合法的请求常见状态代码、状态描述、说明:200 OK /客户端请求成功400 Bad Request /客户端请求有语法错误,不能被服务器所理解401 Unauthorized /请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden /服务器收到请求,但是拒绝提供服务404 Not Found /请求资源不存在,eg:输入了错误的URL500 Internal Server Error /服务器发生不可预期的错误503 Server Unavailable /服务器当前不能处理客户端的请求,一段时间后可能恢复正常eg:HTTP/1.1 200 OK (CRLF)2、响应报头后述3、响应正文就是服务器返回的资源的内容 HTTP详解之消息报头篇 HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。1、普通报头在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。eg:Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader(Cache-Control,no-cache);/response.setHeader(Pragma,no-cache);作用相当于上述代码,通常两者/合用这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cacheDate普通报头域表示消息产生的日期和时间Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接2、请求报头请求报头举例:GET /form.html HTTP/1.1 (CRLF)Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)Accept-Language:zh-cn (CRLF)Accept-Encoding:gzip,deflate (CRLF)If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)If-None-Match:W/80b1a4c018f3c41:8317 (CRLF)User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)Host: (CRLF)Connection:Keep-Alive (CRLF)(CRLF)3、响应报头响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常用的响应报头LocationLocation响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。ServerServer响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是Server响应报头域的一个例子:Server:Apache-Coyote/1.14、实体报头请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。常用的实体报头Content-EncodingContent-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content- Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content- Encoding:gzipContent-LanguageContent-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者。eg:Content-Language:daContent-LengthContent-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。Content-TypeContent-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:Content-Type:text/html;charset=ISO-8859-1Content-Type:text/html;charset=GB2312Last-ModifiedLast-Modified实体报头域用于指示资源的最后修改日期和时间。ExpiresExpires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载, 缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMTHTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(Expires,0);利用telnet观察http协议的通讯过程 实验目的及原理: 利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。 实验步骤:1、打开telnet1.1 打开telnet运行-cmd-telnet1.2 打开telnet回显功能set localecho2、连接服务器并发送请求2.1 open 80 /注意端口号不能省略 HEAD /index.asp HTTP/1.0 Host: /*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/ open 80 GET /index.asp HTTP/1.0 /请求资源的内容 Host: 2.2 open 80 /在命令提示符号下直接输入telnet 80 HEAD /index.asp HTTP/1.0 Host:3 实验结果:3.1 请求信息2.1得到的响应是:HTTP/1.1 200 OK /请求成功Server: Microsoft-IIS/5.0 /web服务器Date: Thu,08 Mar 200707:17:51 GMTConnection: Keep-Alive Content-Length: 23330Content-Type: text/htmlExpries: Thu,08 Mar 2007 07:16:51 GMTSet-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/Cache-control: private/资源内容省略3.2 请求信息2.2得到的响应是:HTTP/1.0 404 Not Found /请求失败Date: Thu, 08 Mar 2007 07:50:50 GMTServer: Apache/2.0.54 Last-Modified: Thu, 30 Nov 2006 11:35:41 GMTETag: 6277a-415-e7c76980Accept-Ranges: bytesX-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remixVary: Accept-EncodingContent-Type: text/htmlX-Cache: MISS from Via: 1.0 :80X-Cache: MISS from Connection: closeHttpClient核心类描述 * * 主要类: * 客户端 * HttpClient, * 请求(post|get) * HttpPost(HttpGet), * 请求数据 * HttpEntity * 简单的表单数据 * UrlEncodedFormEntity -List * 带文件的数据 * MultipartEntity增加FileBody,StringBody * 请求设置请求数据 * HttpPost(HttpGet).setEntity(HttpEntity entity); * 客户端执行请求 * HttpResponse resp = HttpClient.execute(HttpPost|HttpGet) * 响应 * HttpResponse * 响应数据 * HttpResponse.getEntity(); * 中文乱码 * 请求数据的编码: * UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity * (formparams,UTF-8); * Charset utf8 = Charset.forName(UTF-8); * StringBody sb = new StringBody(简单表单数据值1, utf8); * 响应数据的编码: * String respString = EntityUtils.toString(resEntity, UTF-8); *使用连接池 *编写连接池类 *HttpClientPool, *客户端使用的时候代码: *HttpClient httpclient = HttpClientPool. *getInstance().getHttpClient(); *保持会话 *比如tomcat的session使用cookie实现 *首先,客户端项服务器发送登录请求, *登录成功,服务端向客户端写一个cookie,里面存放jsessionid *以后,客户端每次请求服务端的时候, *在请求的消息头中将jsessionid放在cookie中带过去, */定义存放sessionid的threadlocal *private ThreadLocal jsessionid=new ThreadLocal(); */登录,得到响应的头信息中的cookie(jsessionid) *Header h = response.getFirstHeader(Set-Cookie); *if(h!=null) *System.out.println(h-+h.getName()+:+h.getValue(); *String cookie = h.getValue(); */放在threadlocal中,供后面的逻辑代码使用 *jsessionid.set(cookie.substring(0,cookie.indexOf(;); * */登录以后, *String cookie = jsessionid.get();/拿到threadlocal中的cookie值 *httppost.setHeader(cookie, cookie);/设置请求头中的cookie * * 版本3.x和4.x有很大区别4.1需要的jar包httpclient-4.1.jarhttpclient-cache-4.1.jarhttpcore-4.1.jarhttpmime-4.1.jar (上传文件需要)发送请求/ 测试发送请求Testpublic void login() String url = http:/localhost:8080 + /course-ssh2-anno-demo+ /httpClient/login.action;/ 得到客户端HttpClientHttpClient httpclient = new DefaultHttpClient();/ 得到请求HttpPostHttpPost httppost = new HttpPost(url);try / 定义表单数据List formparams = new ArrayList();formparams.add(new BasicNameValuePair(username, aaa);formparams.add(new BasicNameValuePair(password, aaa);/ 定义请求数据UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, UTF-8);/ 请求设置请求数据httppost.setEntity(uefEntity);System.out.println(executing request + httppost.getURI();/ 客户端执行请求,得到响应HttpResponseHttpResponse response = httpclient.execute(httppost);/ 得到响应的消息体(响应数据)HttpEntity entity = response.getEntity();if (entity != null) System.out.println(-);System.out.println(Response content: + EntityUtils.toString(entity, UTF-8);System.out.println(-); catch (Exception e) e.printStackTrace(); finally / 关闭连接,释放资源httpclient.getConnectionManager().shutdown();发送附件/ 测试上传文件Testpublic void uploadFile() HttpClient httpclient = null;try /定义客户端httpclient = new DefaultHttpClient();/定义请求HttpPost httppost = new HttpPost(http:/localhost:8080+ /course-ssh2-anno-demo+ /httpClient/uploadFile.action);/定义Multipart类型的消息体(请求数据)MultipartEntity reqEntity = new MultipartEntity();String path = getExcelPath(member.xlsx);/定义文件数据FileBody bin = new FileBody(new File(path);/Multipart类型的消息体添加文件数据reqEntity.addPart(upload, bin);/ upload为请求后台的File upload属性/Multipart类型的消息体添加普通表单域数据/ 设置传输的参数编码为UTF-8,解决中文乱码问题Charset utf8 = Charset.forName(UTF-8);reqEntity.addPart(param1, new StringBody(简单表单数据值1, utf8);reqEntity.addPart(param2, new StringBody(简单表单数据值2, utf8);/请求设置消息体(请求数据)httppost.setEntity(reqEntity);/客户端执行请求,得到响应HttpResponse response = httpclient.execute(httppost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode = org.apache.http.HttpStatus.SC_OK) HttpEntity resEntity = response.getEntity();/ httpclient自带的工具类读取返回数据/ 设置编码为UTF-8,解决中文乱码问题String respString = EntityUtils.toString(resEntity, UTF-8);System.out.println(respString);EntityUtils.consume(resEntity); catch (Exception e) e.printStackTrace(); finally try httpclient.getConnectionManager().shutdown();/释放连接 catch (Exception ignore) httpclient连接池定义连接池public class HttpClientPool private HttpParams httpParams;private ClientConnectionManager connectionManager;private static HttpClientPool inst = new HttpClientPool();/* * 最大连接数 */public final static int MAX_TOTAL_CONNECTIONS = 100;/* * 获取连接的最大等待时间 */public final static int WAIT_TIMEOUT = 60 * 1000;/* * 每个路由最大连接数 */public final static int MAX_ROUTE_CONNECTIONS = MAX_TOTAL_CONNECTIONS/2;/* * 连接超时时间 */public final static int CONNECT_TIMEOUT = 30 * 1000;/* * 读取超时时间 */public final static int READ_TIMEOUT = 30 * 1000;public static HttpClientPool getInstance() return inst;private HttpClientPool() this.httpParams = new BasicHttpParams();/ 设置最大连接数ConnManagerParams.setMaxTotalConnections(httpParams,MAX_TOTAL_CONNECTIONS);/ 设置获取连接的最大等待时间ConnManagerParams.setTimeout(httpParams, WAIT_TIMEOUT);/ 设置每个路由最大连接数ConnPerRouteBean connPerRoute = new ConnPerRouteBean(MAX_ROUTE_CONNECTIONS);ConnManagerParams.setMaxConnectionsPerRoute(httpParams, connPerRoute);/ 设置连接超时时间HttpConnectionParams.setConnectionTimeout(httpParams, CONNECT_TIMEOUT);/ 设置读取超时时间HttpConnectionParams.setSoTimeout(httpParams, READ_TIMEOUT);SchemeRegistry registry = new SchemeRegistry();registry.register(new Scheme(http, PlainSocketFactory.getSocketFactory(), 8080);/registry.register(new Scheme(http, PlainSocketFactory/.getSocketFactory(), 8080);registry.register(new Scheme(https, SSLSocketFactory.getSocketFactory(), 443);this.connectionManager = new ThreadSafeClientConnManager(httpParams,registry);/* * 从连接池得到连接 * return */public HttpClient getHttpClient() return new DefaultHttpClient(this.connectionManager, this.httpParams);private HttpClientPool(HttpParams httpParams,ClientConnectionManager connectionManager) super();this.httpParams = httpParams;this.connectionManager = connectionManager;使用连接池HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();模拟浏览器模式httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPATIBILITY);保持会话Testpublic void keepSession() / 首先登录String url = http:/localhost:8080 + /course-ssh2-anno-demo+ /httpClient/login.action;String cookieJsessionId = sendLoginRequest(url);/ 然后访问(需要登录之后才能访问的)资源sendRequestAfterLogin(cookieJsessionId);/ 发送登录的请求private String sendLoginRequest(String url) String cookieJsessionId = null;HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();HttpPost httppost = new HttpPost(url);List formparams = new ArrayList();formparams.add(new BasicNameValuePair(username, aaa);formparams.add(new BasicNameValuePair(password, aaa);UrlEncodedFormEntity uefEntity;try uefEntity = new UrlEncodedFormEntity(formparams, UTF-8);httppost.setEntity(uefEntity);System.out.println(executing request + httppost.getURI();HttpResponse response;response = httpclient.execute(httppost);/ 得到响应的头信息中的cookie(jsessionid)Header h = response.getFirstHeader(Set-Cookie);if (h != null) System.out.println(h- + h.getName() + : + h.getValue();String cookie = h.getValue();if (cookie.indexOf(;) 0) cookieJsessionId = cookie.substring(0, cookie.indexOf(;); else cookieJsessionId = cookie;Header headers = response.getAllHeaders();for (int i = 0; i headers.length; i+) Header header = headersi;if (header != null)System.out.println(header: + header.getName() + :+ header.getValue();HttpEntity entity = response.getEntity();if (entity != null) System.out.println(-);System.out.println(Response content: + EntityUtils.toString(entity, UTF-8);System.out.println(-); catch (Exception e) e.printStackTrace();return cookieJsessionId;/ 发送(需要登录之后才能访问的)请求private void sendRequestAfterLogin(String cookie) HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();String url = http:/localhost:8080 + /course-ssh2-anno-demo+ /httpClient/actionAfterLogin.action;HttpPost httppost = new HttpPost(url);httppost.setHeader(cookie, cookie);/ 设置请求头中的cookietry System.out.println(executing request + httppost.getURI();HttpResponse response;response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();if (entity != null) System.out.println(-);System.out.println(Response content: + EntityUtils.toString(entity, UTF-8);System.out.println(-); catch (Exception e) e.printStackTrace();使用httpClient抓取网页内容实例案例:查询身份证号信息项目中需要提供查询身份证号信息的功能,可以抓取其他网站的内容1. 搜索找到提供这些服务的网站2. 得到如下页面3. 打开firebug,查看页面元素页面中传递的参数名称是in_id4. Firebug中打开“网络”选项卡,点击”清除”,清除一些日志,在页面输入身份证进行查询5. 在上图中,可以看到是POST index.php发送的查询请求,点击”POST”查看POST请求的具体的参数信息Url是/index.php参数submit是按钮传递的 再来看看,查询结果页面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无烟学校创建实施方案
- 建材家居物流合同模板
- 法律事务所办公室装修合同
- 健身房装修人工费协议
- 产业园办公区装修增项合同
- 主题餐厅装修设计服务协议
- 保险业务居间委托合同
- 住宅小区建设贷款居间合同
- 书店钢结构改造合同
- 服装品牌代理销售合同范本
- 2024年公路水运交通安全员C证从业资格证考试题库含答案
- 2022-2023学年北京市西城区三帆中学七年级(上)期中数学试卷【含解析】
- 拌合站设备安装实施方案
- 如何指导学生创作科学微电影
- 欧姆龙PLC指令集讲义
- 印刷厂技术参数一览表
- 贴坡式混凝土挡墙浇筑施工方案(完整版)
- 长沙市中小学创新教育专业委员会常务理事单位表【直接打印】
- 环氧乙烷的易燃、易爆、易自聚和毒害性
- 二代动力系统中文说明书
- 事业单位考试备考:公文写作试题(含答案)
评论
0/150
提交评论