Linux系统编程:TCP,UDP协议特点,粘包,wireshark抓包

1.Loop本地回环

Loop本地回环,特指一组以127开头的IP地址范围(即127.0.0.1至127.255.255.254),其中127.0.0.1是最为知名的成员,被誉为本地回环地址(Loop back address)。这一地址类别超脱于常规的IP地址分类之外,它象征着设备内部的虚拟接口,因此被视为一种理论上永不失效的网络连接。即便是在未安装物理网卡的情况下,用户也能通过ping命令成功访问此地址,这在Windows等操作系统中同样适用。

主要功能与应用:

网络配置自检:通过ping 127.0.0.1,用户可以快捷地验证本机网卡及IP协议栈的安装与配置状态。若响应成功,则表明基础网络设置无误。

应用程序资源调用:在SERVER/CLIENT架构的应用 程序中,当服务器与客户端位于同一台机器且缺乏外部SERVER时,可将SERVER资源部署于本机,并通过将SERVER的IP设置为127.0.0.1来实现资源的本地调用,确保程序顺畅运行。

2.解决TCP/IP通信中的粘包问题:

粘包现象概述:TCP因其流式传输特性,常面临粘包问题。即,多个独立的数据包可能在传输或接收过程中被合并处理,导致数据边界模糊。

成因分析:

发送端:为提高效率,TCP可能将多个小数据包合并为一个大包发送,若连续发送的数据量较小,则更易发生粘包。

接收端:若用户进程处理不及时,接收缓冲区内的多个数据包可能相互粘连,待后续数据到达时一并处理。

解决方案:

特定结束符法:在数据包末尾添加特定字符作为结束标志,接收方据此划分数据包界限。但需留意避免数据包内容中自然出现相同字符导致的误判。

固定数据大小法:约定数据包固定大小,不足部分以填充字符补齐。此方法简单但灵活性欠佳,且可能增加网络负担。

自定义数据协议:在TCP基础上构建包含数据头与数据体的自定义协议层。数据头中记录数据体大小等关键信息,接收方据此解析并提取数据体,有效避免粘包问题。此方法虽复杂,但高度灵活,适用于多种复杂场景。

3.recv和send函数说明

recv函数

功能描述:

recv 函数用于从已连接的套接字接收数据。

函数原型:

#include <sys/types.h>

#include <sys/socket.h>

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数说明:

sockfd:套接字描述符,用于标识要接收数据的套接字。

buf:指向缓冲区的指针,用于存储接收到的数据。

len:缓冲区长度,指定接收数据的最大字节数。

flags(可选):指定接收数据的额外选项,如MSG_WAITALL(等待所有数据到达)和MSG_DONTWAIT(非阻塞模式)等。

返回值:

成功时,返回接收到的字节数。

如果连接被正常关闭,则返回0。

如果发生错误,则返回-1,并设置相应的errno以指示错误类型。

注意事项:

recv函数是阻塞的,可通过设置套接字为非阻塞模式或使用select/poll/epoll等机制避免阻塞。

由于网络延迟、拥塞等原因,recv可能无法一次性接收全部数据,需编写循环接收。

接收到的数据可能因TCP/IP协议栈的分片或重新排序而需要重组或解析。

send函数

功能描述:

send 函数用于实现数据的发送功能。

函数原型:

#include <sys/types.h>

#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数说明:

sockfd:套接字描述符,指向已打开并连接到远端地址的套接字。

buf:指向要发送数据的缓冲区的指针。

len:指定要发送的数据的字节数。

flags:发送操作的控制标志,通常设置为0,但可指定特定标志修改send行为。

返回值:

成功时,返回实际发送的字节数,可能小于请求发送的字节数。

如果发送过程中出现错误,返回-1,并设置相应的errno以指示错误类型。

注意事项:

send函数在大多数情况下是阻塞的,可通过设置套接字为非阻塞模式或使用select/poll/epoll等机制避免阻塞。

TCP/IP协议保证数据的完整性和顺序性,但发送的数据可能被分成多个数据包传输。

由于网络延迟、拥塞等原因,send可能无法立即发送所有数据,需编写循环发送。

在非阻塞套接字上,send可能返回小于请求发送的字节数的值,表示只有部分数据被发送,需再次调用send发送剩余数据。

4.TCP协议的特点

面向连接:TCP在传输数据之前,需要先建立连接,即三次握手过程,确保数据的可靠传输。

可靠性:TCP通过序列号、确认应答、超时重传、流量控制、拥塞控制等机制,确保数据的可靠传输。

有序性:TCP保证数据包的顺序与发送顺序一致,即接收方会按照发送方的发送顺序接收数据。

面向字节流:TCP把数据看成一连串无结构的字节流,不保留数据包的边界,适合传输大量数据。

速度慢:由于TCP的可靠性机制,如确认应答、超时重传等,会导致其传输速度相对较慢。

5.UDP协议的特点

无连接:UDP在传输数据之前不需要建立连接,直接发送数据报,减少了开销和延迟。

不可靠性:UDP不保证数据的可靠性,不会进行确认应答、超时重传等操作,因此可能会出现数据丢失、乱序等问题。

面向数据报:UDP保留了数据包的边界,每个UDP数据包都是独立的,适合传输少量数据或需要快速响应的应用。

速度快:由于UDP没有TCP的可靠性机制,因此其传输速度相对较快。

资源消耗少:UDP的头部开销小,只有8个字节,相比TCP的20个字节头部开销要小很多,因此资源消耗较少。

总结:

TCP适合需要高可靠性、有序性、面向字节流传输的应用场景,如文件传输、网页浏览等。

UDP适合对实时性要求高、对可靠性要求不高的应用场景,如视频直播、在线游戏等。

6.wireshark抓包

tcp3次握手

tcp4次挥手

相关推荐
银氨溶液1 小时前
DNS解析域名详解
linux·服务器·apache·域名解析
阿瑾06181 小时前
【Linux】进程间通信——System V共享内存
linux·运维·服务器
leSerein_1 小时前
【Docker】docker的一些常用命令
linux·运维·docker·容器
不会代码的小徐2 小时前
Shell脚本监控Centos 7系统运行状态
linux·运维·centos
十一吖i2 小时前
uniapp实现下拉刷新
linux·服务器·uni-app
SofterICer2 小时前
Test-Specification-v2_3_1-1
linux·运维·服务器
baidu_375528812 小时前
ubuntu20.04/22.04/24.04 docker 容器安装方法
linux·c语言·c++·嵌入式硬件
顶点元3 小时前
Linux TCP服务器和客户端学习
linux·tcp/ip
Flying_Fish_roe3 小时前
linux-用户与权限管理-文件权限
linux·运维·服务器
Betty’s Sweet3 小时前
[Linux]:动静态库
linux·动态库·静态库