TCP头部信息字段
- 释义:
(1)源端口号以及目的端口号:各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程, 一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
(2)序号:占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流(seq)。
(3)确认序号:占4字节,包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到数据字节序号加1(ack)。
(4)数据偏移:4位用于指出TCP首部长度,若不存在选项,则这个值为20字节,数据偏移的最大值为60字节。
(5)保留字段:6位,暂时可忽略,值全为0
(6)标志位:
URG(紧急) : 为1时表明紧急指针字段有效;
ACK(确认):为1时表明确认号字段有效;
PSH(推送):为1时接收方应尽快将这个报文段交给应用层;
RST(复位):为1时表明TCP连接出现故障必须重建连接;
SYN(同步):在连接建立时用来同步序号;
FIN (终止): 为1时表明发送端数据发送完毕要求释放连接,断开连接;
(7)接收窗口:占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。动态控制缓冲区大小。在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。
(8)校验和 :占2个字节,范围包括首部和数据两部分。
选项是可选的,默认情况是不选。
TCP编程
- 两台计算机间进行通讯的三个条件 :IP地址、协议、端口号;
(1)IP地址 :用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识—IP地址。 32位二进制。(定位电脑)
(2)端口:区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。表示是一个16位的二进制整数,2个字节。(定位电脑中的软件)
如:HTTP:80 FTP:21 Telnet:23 ;Tomcat:8080;Oracle:1521;MySQL:3306
查看端口的命令:
查看所有端口:netstat -ano;
查看指定端口:netstat -ano|findstr “端口号”;
查看指定进程:tasklist findstr “进程号”
查看具体程序:使用任务管理器查看PID
(3)Socket套接字: 网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。
套接字就像传输层向应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接受远程发来的数据。
Socket原理机制:
通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输,IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础。
传输特点:
TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低;
TCP实现C/S
- TCP网络编程基于C/S模型 ----》客户端(Client)和服务器(Server)
- Java中基于TCP协议实现网络通信的类:
客户端的Socket类
服务器端的ServerSocket类
- 实现步骤:
Socket通信的步骤:
① 创建ServerSocket和Socket;
② 打开连接到Socket的输入/输出流 ;
③ 按照协议对Socket进行读/写操作 ;
④ 关闭输入输出流、关闭Socket;
服务器端
(1)创建ServerSocket对象,绑定监听端口;bind(端口)
(2)通过accept()方法监听客户端请求 ;listen(监听状态)accept(返回和客户端连接的实例)
(3)连接建立后,通过输入流读取客户端发送的请求信息 ;read/write(读写)
(4)通过输出流向客户端发送相应信息;OutputStream.write()
(5)关闭相关资源;close(关闭资源)
客户端
(1)创建Socket对象,指明需要连接的服务器的地址和端口号;connect(连接 IP + 端口)
(2) 连接建立后,通过输出流想服务器端发送请求信息 ;read/write (读写)
(3)通过输入流获取服务器响应的信息;InputStream.read();
(4)关闭响应资源 ;close(关闭资源)====》四次挥手(双向的过程)
- 代码实现:
注意:客户端连接服务端时,服务端必须先启动。
Server:
public static void main(String[] args) throws IOException {
//创建serversocket的实例
ServerSocket serverSocket = new ServerSocket();
//绑定端口
serverSocket.bind(new InetSocketAddress(8888));//InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。
System.out.println("服务端启动了");
//监听并获得socket,该方法会阻塞
Socket socket = serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress()+" 客户端连接上了");
//进行读写操作
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = reader.readLine())!= null) {
System.out.println(msg);
}
//关闭资源
reader.close();
socket.close();
serverSocket.close();
}
Client:
public static void main(String[] args) throws IOException {
//创建socket实例
Socket socket = new Socket();
//连接服务器 192.168.177.1是我电脑的IP地址
socket.connect(new InetSocketAddress("192.168.177.1", 8888));
System.out.println("客户端连接上服务器了");
//发送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello\n".getBytes());
//关闭资源
socket.close();
}