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

作为一名java EE开发者,我们最常用到的可能就是http协议了,但是我们对http协议及其之下的各层协议真的清楚嘛。现在我们就来大概的了解一下。

一、应用层-HTTP

二、传输层-TCP

三、网络层-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通常是对服务器的根目录解释。因此,始终以/开头。

请求的头部包含了关于客户端环境和请求的主体内容的有用信息。

Accept:text/plain, text/html 可接受的数据类型。

Accept-Language 可接收的语言类型。

Connection:keep-alive 本次连接保持一定的时间,当客户端发送另一个请求时,它会使用同一个连接,作为回应,服务器在响应该次连接时也会在响应头中添加一个Connection:keep-alive,该次连接的具体时长根据不同服务器有不同实现。

Host:localhost 连接的服务器地址。

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) 当前客户端环境信息。

Content-Length:27 发送的请求体内容长度,也就是username=test&passwd=123456内容的长度。

Content-Type:application/x-www-form-urlencoded 发送的请求体内容类型。

Accept-Encoding: gzip, deflate 可接收的数据类型。

最后就是请求体的数据内容 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. 如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的有用程序返回一个“主机不可达”或“网络不可达”的错误。

以上概述的就是网络相关的内容。

我的博客:https://qbian61.github.io/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值