十九.Linux——TCP协议(1)

现在让我们一起实现这个tcp协议的代码吧:

socket():创建套接字

bind():给套接字设置对应的ip和端口

listen():设置监听队列

accept():接收客户端连接

connect():发起连接

recv():接收数据

send():发送数据

代码:

服务器端:ser.c

服务器端持续接收客户端发送的数据,打印并向客户端发送ok

客户端:cli.c

代码:

客户端向服务器发送数据,并会接收服务器发送过来的ok

执行结果:

底层逻辑:

tcp特点之一面向连接的:

三次握手:就是 TCP 建立连接的过程,目的是让客户端和服务器双方都确认:对方的发送和接收能力正常,并且双方就初始序列号达成一致。

connect()之后会进行三次握手(发送三次报文)

服务端 客户端

(SYN和ACK是报文上的特殊标志位)

四次挥手:是 TCP 断开连接的过程。和建立连接需要"三次"不同,断开通常需要"四次"

当某一方调用 close(),内核就会自动发出 FIN 报文,触发四次挥手(发送四次报文)

服务端 客户端

listen(sockfd,5)

监听队列创建未完成握手队列和已完成握手队列,这里设置已完成握手队列大小(5)

完成三次握手,会从未完成进入已完成握手队列,再进行连接

c=accept()接收已完成握手队列中的连接,如果已完成握手队列为空,堵塞

recv()和send()本质是在各自缓冲区中完成的

服务端 客户端

发送方 send() 的数据经内核发送缓冲区和网络,到达接收方内核的接收缓冲区;接收方调用 recv(buf, len) 时,从该缓冲区拷贝最多 len 字节到 buf,实际拷贝多少取决于缓冲区中当前可读的字节数和 len 上限。

例子:

正常情况:

客户端发送hello,服务端设置一次接受五个字符,一次接受完,返回一个ok,客户端打印一个ok

客户端发送hello,服务端设置一次接受一个字符,返回共5个ok,客户端打印五个ok

但如果传输速度不够快,5个ok先传来2个,被rece(),打印2个ok;下次再执行recv()时,才会把剩下的3个ok打印


这就是本文的所有内容,感谢您的观看!

相关推荐
Zevalin爱灰灰1 小时前
Linux入门第二部分(ARM裸机篇) 第三章 汇编LED驱动实验
linux·汇编·arm开发
EVEN-09131 小时前
Linux-IPC进程间通信
linux·运维·服务器
多弗朗皮卡丘1 小时前
Linux 进程信号
linux·运维·服务器
^乘风破浪^1 小时前
Kali配置i3wm教程1
linux·kali·i3wm
qeen871 小时前
【Linux】动静态库的链接与加载过程
linux·运维·系统编程
好啊好啊郝!2 小时前
计算机网络最基础知识点
服务器·网络·计算机网络
辰辰观影2 小时前
外挂字幕怎么导入播放器?2026实用教程
网络
海量计划2 小时前
OSPF路由详细讲解
网络
重生之小比特2 小时前
【Linux系统】17 库制作与原理(上)
linux·运维·服务器