JAVA程序员必须要学会的网络知识
一、http协议
1.1、HTTP报文格式
1.2、HTTP请求报文方法
方法(操作) | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求读取由 URL所标志的信息 |
HEAD | 请求读取由 URL所标志的信息的首部 |
POST | 给服务器添加信息(例如,注释) |
PUT | 在指明的 URL下存储一个文档 |
DELETE | 删除指明的 URL所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
1.3、HTTP响应报文状态码
状态码 | 含义 |
---|---|
1xx | 通知信息,如请求收到了或正在进行处理。 |
2xx | 成功,如接受或知道了。 |
3xx | 重定向,表示要完成请求还必须采取进一步的行动。 |
4xx | 客户的差错,如请求中有错误的语法或不能完成。 |
5xx | 服务器的差错,如服务器失效无法完成请求。 |
1.4、HTTP请求所经历的步骤
现需访问www.baidu.com,具体流程如下:
- 客户端通过DNS解析到
www.baidu.com
的IP地址为220.181.38.149
,通过IP找到服务器路径。客户端发起HTTP会话到220.181.38.149
,然后交给传输层 - 客户端传输层将HTTP会话请求分成报文段,添加源端口和目的端口。如:服务器使用80端口监听客户端请求,客户端通过系统随机选择一个端口,与服务器进行交换,服务器将请求返回给客户端发出请求的端口。
- 传输结束,如果是HTTP1.1可以在发送响应后仍保持一段时间的连接。
二、tcp
2.1、什么是TCP
- TCP是面向连接的传输层协议。在使用TCP协议前,需建立TCP连接,传输完毕后需要释放连接
- TCP是点对点的
- TCP提供可靠交付,保证无差错、不丢失、不重复、按序到达
- 提供全双工通信
- 面向字节流
2.2、TCP和UDP的区别
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 无连接 |
传输类型 | 面向字节流 | 面向报文 |
可靠性 | 可靠 | 不可靠 |
连接数 | 仅一对一 | 一对一、一对多、多对一、多对多 |
开销 | 大 | 小 |
拥塞控制 | 有 | 无 |
2.3、TCP三次握手
首先,B的TCP服务器进程进入监听状态,准备接收客户端请求
- A客户机在打算建立连接时,向B发出连接请求报文,同步位(SYN)置1,选择一个初始序号(seq)x,例如123。同步位为1的报文段不可携带数据,但是要消耗序号
- B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+ 1即124,同时也为自己选择-一个初始序号seq= y如12。
- A客户机进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+ 1即13,而自己的序号seq=x+1即125。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下-一个数据报文段的序号仍是seq=x+1即125。
- 为什么A最后还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
2.4、TCP四次挥手
数据传输结束后,通信的双方都可释放连接。
-
A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段(FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。 TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
-
B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。而A收到B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。
A收到来自B的确认后,就进入FIN-WAIT-2 (终止等待2)状态,等待B发出的连接A收到来自B的确认后,就进入FIN-WAIT-2 (终止等待2)状态,等待B发出的连接
-
若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN= 1。现假定B的序号为w (在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK (最后确认)状态,等待A的确认。
-
A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSE状态
为什么A在TIME-WAIT状态必须等待2MSL(最大报文生存时间)的时间?
1.保证A发送的最后一个ACK报文段能够到达B,保证A、B正常进入CLOSED状态。
- 这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,A能2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,同时重启2MSL计数器,2MSL时间后A和B进入CLOSE状态,如果A在TIME-WAIT状态时接收到B的FIN+ACK报文段之后向B发出确认报文段,而不再确认B是否收到立即进入CLOSED状态,如若B并没有正常收到A 的确认报文段,则B无法正正常进入到CLOSED状态。
2.防止“已经失效的连接请求报文段”出现在本连接中。
- A在发送完最后一个ACK报文段并经过2MSL,会使本次连接持续时间内所有产生的报文段消失,保证在下一次新连接中不会出现旧连接遗留的请求报文段。