常见协议浅谈

DNS协议

DNS协议的作用是将域名解析为IP。我们知道网络上每个站点的位置都是用IP来确定的,所以要想访问一个网站首先就要知道它的IP,不过由数字组成的IP记起来很不方便,所以就设计了比较好的域名来代替IP,这就像我们平时看电视时只需要记着“*一套”,而不需要去记他们是什么频率,不过实际传输还是需要按频率来传输的,我们在选择了相应的频道后电视就会自动接收相应频率的数据,频道和频率转换过程是电视机自己来处理的,但这种方式并不适合网络上的域名和IP的转换,首相是因为 域名的数量非常多,如果让客户端的电脑自己去处理会比较慢,另外域名和IP的对应关系也不像电视频道那样稳定,而是经常在变化,所以就需要有专门讲域名解析为IP的服务器,这就是“DNS服务器”,我们把域名发过去它就可以给我们返回相应的IP,在Windows中可以使用nslookup命令来查看DNS解析的结果
常见协议浅谈
从这里可以看出我使用的DNS服务器是10.230.12.2,解析到www.taobao .com的IP是182.140.245.49和118.123.203.211,而且它是通过CNAME方式解析的,原始设置IP的域名是www.taobao.com.danuoyi.tbcache.com。
世界各地有很多DNS服务器,ISP会给我们提供默认的DNS服务器,也有一些大型公用的DNS服务器可以使用,比如Google的8.8.8.8和国内的114.114.114.114。我们直接访问的DNS服务器叫本地DNS服务器,它本省也没有域名和IP的对应关系,在我们发出请求时它会从主DNS服务器获取然后保存到缓存中,下次再有相同的域名请求时直接从缓存中获取就可以了。

TCP/IP协议

TCP/IP协议通常放在一起来说,不过它们是两个不同的协议,所起的作用也不一样。IP协议是用来查找地址的,对应着网际互联层,TCP协议是用来规范传输规则的,对应着传输层。IP只负责找到地址,具体传输的工作交给TCP来完成,就像快递送货,货单上填写地址的规则已经怎么根据填写的内容找到客户,这就相当于IP协议,而送货时要先打电话,然后将货物送过去,最后客户签收时要签字等就相当于TCP协议。
TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。要理解这个过程首先需要理解TCP中的连个序号和三个标志位的含义:
1、**seq:**sequence number的缩写,表示所传数据的序号。TCP传输时每一个字节都有一个序号,发送数据时会将数据的第一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没有接收完整就需要重新传送,这样就可以保证数据的完整性。
2、**ack:**acknoledgement number的缩写,表示确认号。接收端用它来给发送端反馈已经成功接收到的数据信息的,他的值为希望接收下一个数据包其实序号,也就是ack值所代表的序号前面数据已经成功接收到了。
3、ACK:确认位,只有ACK=1的时候ack才起作用。正常通信是ACK为1,第一次发其请求是因为没有需要确认接收的数据所以ACK为0。
4、SYN:同步位,用于在建立接连时同步序号。刚开始建立连接时并没有历史接收的数据,所以ack也就没有办法设置,这时按照正常的机制就无法运行了,SYN的作用就是来解决这个问题,当接收端接收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,注意这里的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。需要注意的是,SYN会在前两次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。
5、FIN:终止位,用来在数据传输完毕后释放连接。
整个过程如图:
常见协议浅谈
图中上部为三次握手,下部为四次挥手,这里的四次挥手中画的是客户端提出的终止连接,在实际传输过程中也有可能是服务端提出终止连接,他们的处理过程都是一样的。TCP的传输是双全工模式,也就是说传输的双方是对等的,可以同时传输数据,所以无论连接还是关闭都需要双方同时进行。三次握手中前两次可以保证服务端可以正确接收并返回请求,后两次可以保证客户端可以正确接收并返回请求,而且在三次握手的过程中还使用SYN标识初始化了双方的ack值。四次挥手就是双方分别发送FIN标识来关闭连接并让对方确认。三次握手和四次挥手保证了连接的可靠性,不过凡事有理就有弊,这种模式也有它的缺点,是在传输效率上会比较低。
用于传输层的协议出了TCP还有UDP,它们的区别主要是TCP是有连接的,UDP是没有连接的,也就是说TCP协议是在沟通好后才会传数据,而UDP协议是拿到地址后直接就传了,这样产生的结果就是TCP协议传输的数据更可靠,而UDP传输的速度更快。TCP就像是拨打电话,需要先拨通对方号码才能通信,而UDP就像是使用对讲机,拿起来就可以直接讲话。通常视频传输、语音传输等对完整性要求不高而对传输速度要去高并且数据量大的通信使用UDP比较多,而邮件、网页等一般使用TCP协议。
TCP/IP协议只是一套规则,并不能具体工作,就像是程序中的接口一样,而Socket是TCP/IP协议的一个具体的实现。

HTTP协议

HTTP协议是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用。就像过去的发电报一样,电报机就相当于Socket,负责选好发送的目标并将内容发过去,但是直接发过去的数据“嘀嘀嘀”并不能直接使用,还需要解码(在发送前需要先编码再发送)后才能用,电报中的编码和解码就相当于网络传输中的HTTP协议。
HTTP协议中的报文结构非常重要。HTTP中报文分为请求报文(request message)和响应报文(response message)两种类型,这两种类型都包括三部分:首行、头部和主体。请求报文的首行是请求行,包括方法(请求类型)、URL和HTTP版本三项内容,其中原因可有可无。头部保存一些键值对的属性,用冒号“:” 分割。主题保存具体内容,请求报文中主要保存POST类型的参数,响应报文中保存页面要显示的结果。首行、头部和主体以及头部的各项内容用回车换行(\r\n)分割,另外头部和主题之间多一个空行,也就是两个连续的回车换行。它们的结构如图
常见协议浅谈
请求报文中的方法值GET、HEAD、POST、PUT、DELETE等类型,响应报文中的状态码就是Response中的status,一共可以分为5类:
1XX:信息性状态码。
2XX:成功状态码,如表示成功。
3XX:重定向状态码,如301表示重定向。
4XX:客户端错误状态码,如404表示没有找到请求的资源。
5XX:服务端错误状态码,如500表示内部错误。
报文信息可以通过firefox的firedug插件来查看,比如,要看www.csdn.net网址请求的报文,可以在安装好firefox和firebug插件后按F12打开firedug的页面,然后选择“网络”下面的”HTML”,并输入网址发起请求,如图:
常见协议浅谈
图中上边是响应的头信息,下面是请求的头信息,在”响应”选项卡中可以看到响应报文的主体。不过这时的头信息是经过格式化之后的,如果想看原始的可以点击”原始头信息”来查看如图:
常见协议浅谈
Servlet与Java Web开发
Servlet是J2EE标准的一部分,是Java Web开发的标准。标准比协议多了强制性的意义,不过他们的作用基本是一样的,都是用来制定统一的轨迹,因为Java是一种具体的语言,所以为了统一的实现它可以制定自己的标准。
通过前面的TCP/IP协议、HTTP协议已经可以得到数据了,Servlet的作用是对接收到的数据进行处理并生成要返回给客户端的结果,就像电报并翻译成明文后还需要有人来决策并作出回复内容一样。
Servlet制定了Java中处理Web请求的标准,我们只需要按照标准规定的去做就可以了。不过还是那句话,规范自己是不能干活的,标准一样也不能自己干活,要想使用Servlet需要相应的Servlet容器才行,比如,我们常见的Tomcat就是一个Servlet容器。