网络---TCP协议详解

5 篇文章 0 订阅

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();
}    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值