常见协议和标准

DNS协议

DNS协议的作用是将域名解析为IP
因为域名的数量非常多,如果让客户端的电脑自己去处理会比较慢,另外域名和IP的对应关系也在经常变化,所以就需要有专门将域名解析为IP的服务器,就是DNS服务器
我们把域名发过去它就可以给我们返回相应的IP
在windows中使用 nslookup 域名 命令来查看DNS解析的结果

TCP/IP 协议与Socket

IP协议是用来查找地址的,对应着网际互联层
TCP协议是用来规范传输规则的,对应着传输层。
TCP在传输之前会进行三次沟通,一般称为"三次握手",传完数据断开的时候要进行四次沟通,一般称为"四次挥手"
要理解这个过程首先需要理解TCP中的两个序号和三个标志位的含义
seq:sequence number的缩写,表示所传数据的序号。TCP传输时每一个字节都有一个序号, 发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没接收完整就需要重新传送,这样就可以保证数据的完整性
ack:acknoledgement number的缩写,表示确认号。接收端用它来给发送端反馈已经成功接收到的数据信息,它的值为希望接收的下一个数据包起始序号(seq+1),也就是ack值所代表的序号前面数据已经成功接收到了。
ACK:确认位,只有ACK=1的时候ack才起作用,正常通信时ACK为1,第一次发起请求时因为没有需要确认接收的数据所以ACK为0
SYN:同步位,用于在建立连接时同步序号,刚开始建立连接时并没有历史接收的数据,所以ack也就没办法设置,这里按照正常的机制就无法运行了,SYN的作用就是来解决这个问题的,当接收端收到到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,注意这里的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以叫同步位,SYN会在前两次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值
FIN:终止位,用来在数据传输完毕后释放连接

TCP传输是双全工模式,也就是说传输的双方是对等的,可以同时传输数据,所以无论连接还是关闭
都需要对双方同时进行。 
三次握手中前两次可买保证服务端可以正确接收并返回请求,后两次可以保证客户可以正确接收并返回请求
而且在三次握手的过程中还使用SYN标志初始化了双方的ack值
四次挥手就是双方分别发送FIN标志来关闭连接并让对方确认

三次握手和四次挥手保证了连接的可靠性,不过凡事有得就有弊,这种模式也有它的缺点,首先是在传输效率上会比较低,另外三次握手的过程中客户端需要发送两次数据才可以建立连接,这种特性可能被一些别有用心的人利用,比如,发出第一次握手(并接到第二次握手)后就不回应第三次握手了,这里服务器会以为是第二次握手的数据在传输过程中丢失了,然后重新发送第二次握手,默认情况下会一直发送五次,还收不到则会丢弃请求,当有大量这种请求时就麻烦了(DDOS攻击中的SYN Flood攻击)
用于传输层的协议还有UDP,它们的主要区别是TCP是有连接的,UDP是没有连接的
也就是说TCP协议是在沟通好后才会传数据,UDP协议是拿到地址后就传了
TCP就像是打电话,需要先拨通对方号码才能通信,UDP像是使用对讲机,拿起来就可以直接讲话
TCP/IP协议只是一套规则,并不能具体工作,就像是程序中的接口一样,而Socket是TCP/IP协议的一个具体的实现

HTTP协议

HTTP协议是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用,就像过去的发电报一样,电报机就相当于Socket,负责选好发送的目标并将内容发过去,但是直接发过去的数据嘀嘀嘀并不能直接使用,还需要解码(在发送前需要先编码再发送)后才能用,电报中编码和解码就相当于网络传输的HTTP协议。
HTTP协议中的报文结构非常重要。分为请求报文响应报文
这两种类型都包括三部分:首行、头部和主体

首行
请求报文的首行是请求行,包括方法(请求类型GET,POST)、URL和HTTP版本
响应请求的首行是状态行,包括HTTP版本、状态码和简短原因。其中原因可有可无

头部
头部保存一些键值对的属性,用:分割

主体
主体保存具体内容,请求报文中主体保存POST类型的参数,响应报文中保存页面要显示的结果

首行、头部和主体以及头部的各项内容用回车换行(\r\n)分割,头部和主体之间多一个空行,
也就是有两个连续的回车换行

Response中的status一共可以分为5类
1XX:信息性状态码
2XX:成功状态码,如200表示成功
3XX:重定向状态码,如301表示重定向
4XX:客户端错误状态码,如404表示没找到请求的资源
5XX:服务端错误状态码,如500表示内部错误

Servlet与Java Web开发

Servlet是J2EE标准的一部分,是Java Web开发的标准。标准比协议多了强制性的意义
不过它们的作用基本是一样的都是用来制定统一的规矩,因为Java是一种具体的语言,所以为了统一的实现它可以制定自己的标准。
通过前面的TCP/IP协议、HTTP协议已经可以得到数据了,Servlet的作用是对接收到的数据进行处理并生成要返回给客户端的结果,这就像电报中接收到电报并翻译成明文后还需要有人来决策并作出回复内容一样。
规范自己是不能干活的,标准一样也不能自己干活,要想使用Servlet需要有相应的Servlet才行。

你可能感兴趣的:(架构)