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

 32c1abca85a94a12ab8fdc205a9ab480.png

 

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抓包

200baf798f2a461f9ca0db48e9bc54a6.png

 tcp3次握手

b3c3b0bb5f7c4bfc9c586ffc0049301a.png

 tcp4次挥手

f0793378ca074312ab77d3a9956d9be3.png

 

 

 

 

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值