网络学习笔记
1、网络
网卡 MAC 其实是输入输出 (IO)设备
一个电脑有0~65535个端口
网络四元组:
本机IP
对方IP
本机端口号
对方端口号
传输方式: 协议 TCP UDP
TCP的三次建立连接的状态迁移
1.首先服务器端,必须先开启某一个端口的监听
2.由客户端向服务器的监听端口发起的一个SYN请求,其中SYN等于一个数字,SYN= x,发送的时候,客户端需要选择一个自己的端口发送该SYN’请求,一般来说,客户端选择的端口都是随机的,但是当选择完这个端口以后,就一直使用这个端口传输数据,在该链接没有断开之前,不会换端口。
当发送完SYN请求以后,客户端的该端口状态变成了SYN_SENT(同步信息)状态
3.当服务器端的监听端口,收到客户端发送的SYN=x这个数据的时候,,自己的端口状态变成了SYN_RECV状态,
同时,向发送SYN的客户端的那个端口回复一个数据,这个数据,包含两条信息,一个是SYN= y,另一个是ACK = x+1
4.当客户端收到服务器发过来的SYN+ACK消息的时候,客户端就会将端口立刻变化成Estabelish状态,
同时,客户端会发送一条数据给服务器,这个数据是ACK = y+1;
5.当服务器收到客户端发来的ACK = y+1 的时候,服务器中的SYN_RECV状态变成Estabelish状态
套接字 Scoket
TCP协议属于传输层协议,而我们写代码一般是直接使用封装好的TCP工具或者应用层协议来驱动传输层的工作
如果我们想在Java语言中,驱动TCP协议来传输数据,那么我们可以使用Java封装好的工具叫做Scoket(套接字)编程实现,
Java给出的TCP套接字就是Socket,而需要分清楚服务器和客户之间使用的不同,服务器端使用的是ServerSocket,客户端使用的是Socket
TCP的挥手
此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接.
1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为 u+1,并且带上自己的***seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。 TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3、客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)
4、 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,确认序号为v+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w+1,而自己的***是u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
TCP状态图
TCP的特点:
TCP | |
---|---|
特点 | 1.TCP传输数据,是需要建立一个有效的连接的。也就是说,我们使用TCP传输数据的第一件事,是建立一个数据通道的。 |
优点 | 2.TCP对于有效连接是由实时感知的,也就是说,TCP的连接中断时,另一方是有能力立刻得知的。3.TCP传输的数据是安全的,有效的,有序的。 |
缺点 | 1.TCP占用资源更多。 2.TCP的有序性,一定情况下会拖慢应用层程序的运行。 |
目前市面上见到的很多的IM软件(即时通信软件)很多都不去采用TCP,而是采用UDP来实现。
UDP:
1.UDP叫做用户报协议
2.UDP是面向数据包的,或者说面向无连接的
3.UDP传输数据是不可靠的,但是传输速de度很快。
1.对于UDP来说,发送数据使用的DatagramSocket,接收数据也是使用DatagramSocket,所以DatagramSocket没有所谓的明显的服务和客户端的区别。(注:Socket有,服务端是ServerSocket,客户端是Socket)
2.DatagramSocket是收发数据的工具,但是并不关心数据发送去哪里,或者从哪里来,他只做一件事,就是要么将数据发到网络当中,让数据自己去自己该去的地方(你去哪他不管),要么就是从网络里面打捞出来自己要的数据(小数据包长得还挺好看)
3.真正的内容容器是,DatagramSocket,这个保温在发送端,我们要设置其发送的内容 ,发送的地址,发送的端口号,等等,设置完DatagramSocket就可以了在接受端,我们要通过DatagramSocket来接受数据。接受的数据,在byte[]里面,
4.UDP传输数据的过程中,没有流的概念,只有报文的概念。
参考文章链接:
https://blog.****.net/iva_brother/article/details/90317645