大家好,我是码农先森。
TCP(传输控制协议)的出现是为了解决计算机网络中的数据可靠传输和连接管理的问题。在早期的计算机网络中,特别是在分组交换和互联网的发展初期,网络是不可靠的,存在丢包、错误和延迟等问题。为了保证数据能够可靠地传输,需要一种协议来提供可靠的传输机制。而早期的协议如UDP(用户数据报协议)是无连接的、不可靠的,无法满足应用程序对连接管理的需求。TCP协议提供一种标准化、可靠的数据传输服务,促进了互联网的发展和应用的普及。
TCP(传输控制协议)是一种可靠的、面向连接的传输层协议。它提供了一种端到端的可靠数据传输机制,确保数据在不可靠的网络中按序送达,并且无差错、无重复和无丢失。
TCP三次握手是建立TCP连接时使用的一种协议,其步骤如下:
第一次握手(SYN):
客户端向服务器发送一个带有SYN(同步)标志位的数据包,用于请求建立连接。该数据包中会携带客户端的初始序列号。
第二次握手(SYN + ACK):
服务器收到客户端的连接请求后,会向客户端发送带有SYN和ACK(确认)标志位的数据包作为响应。该数据包中会携带服务器的初始序列号,并确认客户端的序列号。
第三次握手(ACK):
客户端收到服务器的响应后,会向服务器发送一个带有ACK标志位的数据包进行确认。这个确认信号代表客户端已经准备就绪,连接已建立。
双方完成以上三个步骤后,TCP连接建立成功,可以开始进行数据传输。
TCP四次挥手是用于关闭TCP连接的协议,其步骤如下:
第一次挥手(FIN):
当客户端决定关闭连接时,会发送一个带有FIN(结束)标志位的数据包给服务器,表示不再发送数据,但仍然可以接收数据。
第二次挥手(ACK):
服务器收到客户端的关闭请求后,会发送一个带有ACK标志位的数据包作为确认响应。该数据包表示服务器已经接收到了客户端的关闭请求。
第三次挥手(FIN):
当服务器也准备关闭连接时,会向客户端发送一个带有FIN标志位的数据包,表示服务器不再发送数据。此时,服务器也进入了关闭等待状态。
第四次挥手(ACK):
客户端收到服务器的关闭请求后,会发送一个带有ACK标志位的数据包作为确认响应。该数据包表示客户端已经接收到了服务器的关闭请求,连接将被完全关闭。
在四次挥手完成后,双方都进入了关闭状态,释放连接资源,并确保最后的数据段都能够被可靠地传递。这样可避免因为网络延迟或丢包而导致的数据传输错误或资源浪费。
new Swoole\Server('0.0.0.0', 9501)
创建了一个TCP服务器对象,监听0.0.0.0地址和9501端口
。$server->on('connect', function ($server, $fd) { ... });
监听TCP连接事件。$server->on('receive', function ($server, $fd, $fromId, $data) { ... });
监听TCP数据接收事件。$server->on('close', function ($server, $fd) { ... });
监听TCP连接关闭事件。$server->start();
启动TCP服务器,使其开始监听并处理连接请求。<?php
// 创建 TCP 服务器对象,监听 0.0.0.0:9501 端口
$server = new Swoole\Server('0.0.0.0', 9501);
// 监听 TCP 连接事件
$server->on('connect', function ($server, $fd) {
echo "New TCP connection established: {$fd}\n";
});
// 监听 TCP 数据接收事件
$server->on('receive', function ($server, $fd, $fromId, $data) {
echo "Received data from {$fd}: {$data}\n";
// 向客户端发送回复消息
$server->send($fd, 'Hello from Swoole server!');
});
// 监听 TCP 连接关闭事件
$server->on('close', function ($server, $fd) {
echo "TCP connection closed: {$fd}\n";
});
// 启动 TCP 服务器
$server->start();
net.Listen("tcp", "0.0.0.0:9501")
函数在0.0.0.0:9501
地址上创建了一个TCP监听器。listener.Accept()
函数接受客户端的连接请求。handleConnection(conn)
函数处理连接。conn.Read()
函数从连接中读取数据conn.Write()
函数向客户端发送回复消息"Hello from Go server!"
。package main
import (
"fmt"
"net"
)
// nc 0.0.0.0:9501
func main() {
// 监听 0.0.0.0:9501 地址
listener, err := net.Listen("tcp", "0.0.0.0:9501")
if err != nil {
fmt.Println("Failed to start TCP server:", err)
return
}
defer listener.Close()
fmt.Println("TCP server started on 0.0.0.0:9501")
for {
// 接受客户端连接请求
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
// 处理客户端连接
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Println("New TCP connection established:", conn.RemoteAddr())
// 处理接收和发送数据
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("Error reading data:", err)
break
}
data := buffer[:n]
fmt.Printf("Received data from %s: %s\n", conn.RemoteAddr(), string(data))
// 回复消息给客户端
conn.Write([]byte("Hello from Go server!"))
// 处理完数据后结束连接
break
}
fmt.Println("TCP connection closed:", conn.RemoteAddr())
}
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。