web开发者不可不知的网络知识

日期:2017-06-16       浏览:737

一 概念

作为一名java EE开发者,我们最常用到的可能就是http协议了,但是我们对http协议及其之下的各层协议真的清楚嘛。现在我们就来大概的了解一下。
1.1 应用层-HTTP
1.2 传输层-TCP
1.3 网络层-IP

二 应用层-HTTP

一个http请求包含三个组成部分:
  1. 方法-统一资源标识符(uri)-协议/版本
  2. 请求的头部
  3. 主体内容
以下是一个http请求的例子:
POST /test/index.jsp HTTP/1.1
Accept:text/plain, text/html
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Host:localhost
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)
Content-Length:27
Content-Type:application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

username=test&passwd=123456
方法-统一资源标识符(uri)-协议/版本,出现在第一行。
POST /test/index.jsp HTTP/1.1
这个是post请求方法,/test/index.jsp是uri。而HTTP/1.1 是协议/版本部分。
每个http请求可以使用http标准里的多种方法之一。http 1.1支持7中类型的请求:GET,POST,HEAD,OPTIONS,PUT,DELETE和TRACE。get和post在互联网内使用最为普遍。
uri完全指明了一个互联网资源,uri通常是对服务器的根目录解释。因此,始终以/开头。
请求的头部包含了关于客户端环境和请求的主体内容的有用信息。
最后就是请求体的数据内容 username=test&passwd=123456。注意请求头和请求体之间有一个换行存在,这也就是区分这两部分的关键所在。
以上内容就是http协议的请求数据,作为一个web服务器(tomcat),其实就是一个tcp服务器,当接收到该socket请求时,会获取该次socket连接的InputStream输入流对象传给request对象,获取该次socket连接的OutputStream输出流对象传给response对象。通过输入流对象可以读取到以上发送的全部信息,然后将其封装到request对象的相应属性上,例如requestMap,requestNames,requestUri,cookie等属性上,我们就可以通过相应的getter方法获取到客户端请求信息了。根据请求的uri反射获取请求的servlet对象实例,然后将封装好的request对象和response对象传递给servlet的service方法,并执行service内的逻辑,最后通过response对象(也就是该次socket连接的输出流对象)写会数据到客户端。一次http请求也就算结束了。
以上说明的只是http协议的部分。接下来我们说下http下面的协议。

三 传输层-TCP

应用层http协议是建立在传输层tcp协议之上的。tcp协议是个可靠传输,全双工的协议,可靠传输是指该协议在不可靠的ip协议之上做了自己的接受确认和超时重发机制,所以建立连接前需要三次握手,并且建立的是长链接。全双工指的是发送方和接收方可以互发数据,也就是双向通信,所以断开连接前需要四次挥手(部分情况下存在半连接,即一方发送SYN告诉另一方自身不再发送数据,但还可以接收另一方发来的数据)。一个tcp数据报包含了请求方应用程序端口号,响应方应用程序端口号,该端口号用于指定需要连接的应用程序。
tcp协议的可靠性给我们做了有力的数据传输保障,我们不需要关心存在数据包丢失问题。因为tcp数据报内存在着请求方和相应方的应用程序端口号,所以可以实现全双工通信(双向通信)。双向通信为我们http的Connection:keep-alive做了保障,keep-alive保持连接后可以多次双向传输数据,可节省建立多个连接,而且http1.1协议内存在的半连接也是建立在这之上的。
IP是一个无状态的协议,也就是每一个IP数据报的发送的路由是变化的,这就导致了接收方接收到的数据报是无序的,但tcp协议头内存在着对数据报的排序,所以通过tcp协议最后接收到的数据会进行排序,从而使我们看到的是一个完整有序的数据。

四 网络层-IP

说完了tcp我们接下来聊一下ip协议。tcp协议调用的就是ip协议了,ip协议只负责寻址。我们都知道在请求一个域名时首先第一步就是去dns解析域名获取该域名背后的ip地址,因为下层的所有协议都是使用的ip地址(域名解析协议除外)。如果我们对某个域名请求达到一定的次数的话,我们的电脑就会将该域名背后的IP缓存到内存中,下次就不再解析该域名,这就节省了域名解析所消耗的时间。当然,我们关机后缓存的IP也就会清空掉。
一个ip地址我们可以将其理解为三部分,根据子网掩码的不同,我们可以找到相对应的网络号,子网号,主机号。通过大的网络号寻找下面对应的子网号,然后通过子网号找到目标主机号。
ip路由寻址主要完成以下功能:
  1. 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
  2. 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
  3. 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
  4. 如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的有用程序返回一个“主机不可达”或“网络不可达”的错误。
以上概述的就是网络相关的内容。
扫码关注有惊喜

(转载本站文章请注明作者和出处 qbian)

暂无评论

Copyright 2016 qbian. All Rights Reserved.

文章目录