java网络编程
OSI七层模型
1、物理层
物理层并不是物理媒体本身,它只是开放系统中利用物理媒体实现物理链接的功能描述和执行连接的规程。
2、数据链接层
数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。
3、网络层
路由选择和中继,在一条数据链路上复用多条网络的连接
4、传输层
定义传输数据的协议端口号,以及流控和差错校验
5、会话层
建立、管理、终止会话
6、表示层
把应用层提供的信息变换为能够共同理解的形式
7、应用层
网络服务与最终用户的一个接口
TCP/IP协议
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
由网络层的IP协议和传输层的TCP协议组成,采用了4层的层级结构。
包括:应用层、传输层、网络层、链路层
TCP和UDP
TCP是面向连接的、可靠的流协议,通过三次握手建立连接,通讯完成时要拆除连接。
UDP是面向无连接的通信协议,UDP通讯时不需要接收方无恶人,属于不可靠的传输,可能会出现丢包现象。
TCP和UDP的优缺点
TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。
端口号
端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
TCP三次握手
所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机生成一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
TCP四次挥手(分手)
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序列号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文即使不携带数据,也要消耗一个序列号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务器端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器端若发送数据,客户端依然要接受,这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续时间。
3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送链接释放报文。
4、服务器将最后的数据发送完毕后,就向客户端发送链接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,嘉假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,seq=w+1,而自己的序列号为seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文寿命)的时间后,当客户端撤销相应的TCB(传输控制块)后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCP后,就结束了这次的TCB连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
一次完整http请求的7个过程
建立TCP连接(之前可能还有一次DNS域名解析)
客户端向服务器发送请求命令
客户端发送请求头信息
服务器应答
服务器返回响应头信息
服务器向客户端发送数据
服务器关闭TCP连接
短连接:
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接:
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。