1 网络分层中的IOS七层模型、TCP/IP协议族、TCP、IP,这些有什么不同
2 TCP协议通信过程中的三次握手和四次挥手到底是什么流程?
在生活中,我们经常用QQ、微信、百度云盘、Goole、IE浏览器、火狐浏览器......。可以总结为两大类,c/s(客户端/服务端)和b/s(浏览器/服务器)结构。这两种架构是两台计算机通过某中协议来网络中进行通信。
1 ISO国际标准话组织在研究网络通信,建立了OSI模型(开放系统互联参考模型)。即为标准的7层架构。(理论上分层模型)
2 TCP/IP协议族,最早由美国国防部的ARPA网项目,也被DoD模型。(实践过程中的模型)
3 TCP,IP这是网络分层中具体的协议。
1 我们在浏览器输入淘宝的网址。
2 (本机)浏览器将请求发送,应用层-》传输层-》网络层-》数据链路层
3 (网络传输过程)-》到路由器-》交换机
4 (淘宝服务器)-》到达淘宝服务器-》链路层-》网络层-》传输层-》应用层,获取数据
5 (响应数据)-》然后再原路返回。
Socket是位于应用层和传输层的一个抽象层。提供了一套接口来调用TCP/IP协议的API。
序号和确认号:TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传输流中,每个字节一个序号。
URG:表示本报文段中发送的数据是否包含紧急数据。URG=1,表示有紧急数据。后面的紧急指针字段
只有当URG=1时才有效。
ACK:表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才
有效。TCP规定,连接建立后,ACK必须为1。
PSH:告诉对方收到该报文段后是否应该立即把数据推送给上层。如果为1,则表示对方应当立即把数据
提交给上层,而不是缓存起来。
RST:只有当RST=1时才有用。如果你收到一个RST=1的报文,说明你与主机的连接出现了严重错误(如
主机崩溃),必须释放连接,然后再重新建立连接。或者说明你上次发送给主机的数据有问题,主机拒绝
响应。
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;
当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的
报文。只有在前两次握手中SYN才置为1。
FIN:标记数据是否发送完毕。如果FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放
连接了。
窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而
达到流量控制。
选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接
方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本
端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中
加入额外的零,以保证TCP头是32的整数倍
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段
仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时
的许多情况中,也会发送不带任何数据的报文段。
SYN(synchronous建立连接) 请求建立连接,并在其序列号字段进行序列号的初始值设定。建立连接,设置为1。
ACK(acknowledgement 确认) 确认号是否有效,一般置为1
PSH(push传送) 提示接受端应用程序立即从TCP缓冲区把数据读走。
FIN(finish结束) 希望断开连接。
RST(reset重置) 对方要求重新建立连接,复位。
URG(urgent紧急) 紧急指针是否有效。为2,表示某一位被优先处理。
//服务端代码
public class ServerSocket {
public static void main(String[] args) throws Exception {
//创建ServerSocket对象,用于客户端的连接
java.net.ServerSocket serverSocket = new java.net.ServerSocket(8989);
//定义输入流对象读取数据
byte[] bytes = new byte[1024];
try {
while (true) {
System.out.println("服务端发生阻塞,等待连接....");
//调用accept方法监听客户端,阻塞方法
Socket accept = serverSocket.accept();
//调用Socket对象的方法获取输入流对象
InputStream inputStream = ((Socket) accept).getInputStream();
System.out.println("服务端发生阻塞,等待接收数据....");
int read = inputStream.read(bytes);
System.out.println(new String(bytes, 0, read));
//关闭资源
accept.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (serverSocket != null && !serverSocket.isClosed()) {
serverSocket.close();
}
}
}
}
//客户端代码
public class ClientSocket {
public static void main(String[] args) throws Exception {
//创建Socket对象,与服务端Socket建立连接
Socket socket=new Socket("127.0.0.1",8989);
//获取输出流对象
OutputStream outputStream=socket.getOutputStream();
System.out.println("客户端阻塞,接收键盘输入....");
//接收键盘输入,模拟延迟消息发送
Scanner scanner=new Scanner(System.in);
String scannerString=scanner.next();
outputStream.write(scannerString.getBytes());
System.out.println("客户端录入完成....");
//使用输出流对象写入数据
// outputStream.write("itheima-TCP".getBytes());
//释放资源
socket.close();
}
}
b 第二次握手
第二次"握手"时,服务端向客户端发送 SYN ACK 标志位,其中ACK标志位表示是对收到的数据包的确认,说明服务端接收到了客户端的连接。ACK的值是1,表示服务端期待下一次从客户端发送数据流的序列号是1,而Seq=0代表服务端曾经并没有给客户端发送数据,而本次也没有发送数据,因为Len=0也证明了这一点。
c 第三次握手
第三次“握手”时,客户端向服务端发送的ACK标志位为1, Seq的值是1。Seq=l代表这正是服务端所期望的Ack=1。Len=0说明客户端这次还是没有向服务端传递数据,而客户端向服务端发送ACK 标志位为1的信息,说明客户端期待服务端下一次传送的Seq的值是1。
b 第二次挥手
在第二次"挥手"时,服务端向客户端发送标志位ACK,Seq=1代表的正是客户端想看的Ack=1。Ack=2表示服务端期望下一次客户端发送的数据流的序号为2。len=0,说明没有数据传输到客户端。
c 第三次挥手
在第三次"挥手"时,服务端向客户端发送标志位FIN ACK,告知客户端服务端关闭了。Seq=1代表的正是客户端想看的Ack=1。Ack=2表示服务端期望下一次客户端发送的数据流的序号为2。len=0,说明没有数据传输到客户端。
d 第四次挥手
在第四次"挥手"时,客户端向服务端发送标志位ACK,告知服务端客户端已经收到服务端关闭信息。Seq=2
代表的正是服务端想看的Ack=2,ACK=2表示客户端期望下一次服务端发送的数据流的序号为2。
注意 BIO存在问题
1、客户端已经连接服务端,尚未发送数据,read阻塞
2、新的客户端无法正常连接
解决办法
1、线程解决(mysql客户端连接服务器)
2、线程池解决(线程池泄露)
3、NIO解决
4、websocket
NIO又称为非阻塞IO,是JDK1.4提出的新的IO模型
b 写模式
capacity:数组中可以存储元素的个数
position:下一次可插入元素位置,默认值为0,每添加一个元素都向后移动一位,最大值:capacity - 1
limit:在写的模式下,limit表示第一个不可写的位置(默认第一个不可写的位置,应该是数组容量值得下一个位置,即默认值为capacity)
c 读模式
capacity:数组中可以存储元素的格数。
position:Buffer由写模式变化为读模式,position会从置0,在进行读取数据时,position向前移动到下一个可读的位置。
limit:第一个不可读位置,当写模式切换到读模式,limit设置写模式下的position值。即能读到之气那所有写入的数据。
1 概述
类似于流进行数据传输,但是和流不同。流是单向的,大部分功能比较单一,要么进行读要么进行写。
通道的使用必须要结合Buffer。
u1fbpfcp-watermark.image)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。