一、TCP/IP protocol
TCP/IP协议族
1.分为四层:应用层(FTP、DNS、HTTP)、传输层(TCP\UDP)、网络层、数据链路层(硬件)。
2.传输流程:(发送端从应用层往下走,接收端从链路层网上走)
例如客户端是发送端,服务器是接收端:客户端从上到下到链路层,找到服务器的链路层,再从下到上传到应用层。
发送端每通过一层增加上该层的首部信息,接收端每通过一层删除该层的首部信息。这种把信息包装起来的方法叫做封装。
3.TCP协议的作用:请求端把HTTP请求报文分割成有序号的数据包+服务端按序号组合接收到的数据包
4.IP协议的作用:通过路由器,一边中转一边送达数据包。
5.HTTP协议的作用:请求端生成请求报文+服务端分析处理TCP层按序号组合好的请求报文。
6.TCP著名的三次握手
众所周知,TCP协议提供可靠的字节流服务(把HTTP请求报文分割成数据包),那么为什么可靠呢?因为使用TCP协议发送完数据包后,发送端会与接收端进行三次握手:
第一次:发送端发送一个标有SYN的数据包
第二次握手:接收端接收到以后,回发一个标有SYN/ACK的数据包
第三次握手:发送端接收到,发送标有ACK的数据包。
ps:SYN和ACK都是TCP的标志。
如有哪个环节莫名中断,TCP协议会重复这个三次握手过程。
二、简单socket网络编程(Java实现)
服务端代码
import java.util.Scanner;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) throws Exception{
//1.创建一个服务端socket
ServerSocket serverSocket=new ServerSocket(8888);
//2调用accept方法等待连接,线程会阻塞状态
System.out.println("Socket服务已启动,等待连接");
Socket socket=serverSocket.accept();
System.out.println("接收到客户端连接请求");
//3.实现数据的交互
//获取输入流
InputStream inputStream= socket.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取信息
System.out.println("收到客户端的请求:"+info);
}
socket.shutdownInput();
//4.获取输出流,相应客户端请求
OutputStream os=socket.getOutputStream();
PrintWriter out=new PrintWriter(os);
out.write("这是server端");
out.flush();
//关闭资源
out.close();
os.close();
br.close();
isr.close();
isr.close();
socket.close();
serverSocket.close();
}
}
客户端代码
import java.io.*;
import java.net.Socket;
public class client {
public static void main(String[] args)throws Exception {
//1.创建Socket客户端,指定服务器和端口
Socket socket=new Socket("127.0.0.1",8888);
//2.连接成功后发送信息
//获取输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter out=new PrintWriter(outputStream);
out.write("admin,admin");
out.flush();
//这一句很重要,要写在前面,如果不写在这里,Socket Server 端的代码就会卡在读取inputStream中
socket.shutdownOutput();
//3.获取输入流得到服务器端的响应
InputStream inputStream= socket.getInputStream();
InputStreamReader isr=new InputStreamReader(inputStream);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取信息
System.out.println("收到服务端的响应:"+info);
}
br.close();
isr.close();
out.close();
out.close();
socket.close();
}
}