tcp网络通信
本地回环(Loopback)的概念
本地回环地址是一个特殊的IP地址,用于指向计算机本身的网络接口。在IPv4中,最常见的本地回环地址是127.0.0.1,而在IPv6中则是::1。这个地址用于测试网络软件,确保网络协议栈在本地计算机上正确运行,而不涉及实际的网络硬件。本地回环地址通常与一个虚拟的网络接口关联,在Linux系统中这个接口被称为lo。
本地回环的作用和重要性
本地回环接口允许在同一台计算机上运行的不同程序之间进行网络通信。这对于开发和测试网络应用程序非常有用,因为它提供了一个安全、可靠的环境来模拟网络交互,而无需实际的网络连接。
粘包问题的原因
TCP协议是面向流的,它不保证发送的数据包边界与接收端的数据包边界一致。这意味着,发送端发送的多个数据包可能会在接收端合并成一个大的数据包(接收端粘包),或者一个大的数据包在接收端被拆分成多个小包(发送端粘包)。粘包问题通常发生在以下情况:
1.发送端发送数据时,TCP协议可能会根据网络状况和优化算法(如Nagle算法)合并多个数据包,以提高网络利用率。
2.接收端应用程序处理数据的速度跟不上数据的接收速度,导致接收缓冲区中的数据累积,从而出现粘包现象。
解决粘包问题的方法
为了解决TCP粘包问题,可以采取以下几种方法:
1.消息边界标记:在发送的消息中加入特定的边界标记(如换行符\n),接收端根据这些标记来分割数据。
2.固定长度消息:确保每个消息都有固定的长度,接收端根据固定长度来接收数据。
3.消息头包含长度信息:在每个消息前添加一个固定长度的消息头,包含消息的实际长度信息,接收端先读取消息头,再根据长度信息读取相应长度的数据。
recv函数
recv函数是网络编程中用于从套接字接收数据的系统调用。在C语言中,recv函数的原型通常如下:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
1.sockfd:表示要从中接收数据的套接字描述符。
2.buf:指向缓冲区的指针,用于存放接收到的数据。
3.len:缓冲区的大小,即buf可以存储的最大字节数。
4.flags:指定接收操作的行为,常用的标志包括0(正常接收)、MSG_PEEK(窥视接收的数据,不从接收缓冲区中移除数据)、MSG_WAITALL(等待直到接收到指定长度的数据)等。
recv函数在成功接收数据时返回实际接收的字节数,该值可能小于请求的长度。如果连接已关闭,recv返回0。如果发生错误,recv返回-1,并设置errno以指示错误类型。在非阻塞模式下,如果没有数据可读,recv可能立即返回-1,并设置errno为EAGAIN或EWOULDBLOCK.
send函数
send函数是网络编程中用于向套接字发送数据的系统调用。在C语言中,send函数的原型通常如下:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
1.sockfd:表示要发送数据的套接字描述符。
2.buf:指向要发送数据的缓冲区的指针。
3.len:要发送的数据的长度(以字节为单位)。
4.flags:指定发送操作的标志,可以影响发送的行为,如MSG_NOSIGNAL(发送数据时忽略SIGPIPE信号)、MSG_DONTWAIT(设置为非阻塞模式)等。
send函数在成功发送数据时返回发送的字节数,如果发送失败则返回-1,并设置errno以指示错误类型.
wireshark抓包工具
Wireshark 简介
Wireshark 是一款开源的网络协议分析工具,广泛用于网络故障诊断、安全分析、软件和网络开发的调试。它能够捕获和详细显示网络上传输的数据包,支持数百种网络协议,并提供强大的过滤和搜索功能,帮助用户快速定位问题。
使用 Wireshark 抓包
1.启动 Wireshark:运行 Wireshark 应用程序,选择要监控的网络接口。
2.开始捕获:选择网络接口后,点击“开始捕获”按钮,Wireshark 将开始捕获经过该接口的数据包。
3.停止捕获:捕获数据包后,点击“停止捕获”按钮。
4.数据包过滤:使用 Wireshark 的过滤功能,可以在捕获数据包时或捕获后过滤出特定的数据包,以便更精确地分析。
5.数据包分析:双击数据包列表中的任何数据包,可以在详细面板中查看数据包的内容和协议结构。
6.保存捕获文件:可以将捕获的数据包保存为 pcap 文件,以便后续分析或与其他人共享。
高级功能
TCP(Transmission Control Protocol,传输控制协议)
首部是TCP报文段的固定部分,它包含了用于建立、维护和终止TCP连接的控制信息。TCP首部的结构如下:
1.源端口(Source Port):占2字节,标识发送应用程序的端口。
2.目的端口(Destination Port):占2字节,标识接收应用程序的端口。
3.序号(Sequence Number):占4字节,用于标识报文段中第一个字节的序号。
4.确认号(Acknowledgment Number):占4字节,用于确认已成功接收的字节序号。
5.数据偏移(Data Offset):占4位,指示TCP首部的长度,以32位字为单位。
6.保留(Reserved):占6位,当前保留,必须设置为0。
7.控制位(Control Flags):占6位,包含多个标志位,如SYN(同步序列编号)、ACK(确认)、PSH(推送)、RST(重置)、FIN(结束)等。
8.窗口大小(Window Size):占2字节,指示接收窗口的大小,用于流量控制。
9.校验和(Checksum):占2字节,用于检测首部和数据在传输过程中的错误。
10.紧急指针(Urgent Pointer):占2字节,仅在URG控制位为1时有效,指示紧急数据的偏移量。
11.选项(Options):长度可变,最长可达40字节,用于支持各种扩展功能。
12.填充(Padding):用于确保首部的总长度是4字节的整数倍。
TCP首部的长度可变,但至少为20字节,这是因为首部的前20个字节是固定的,而选项字段是可选的,可以根据需要增加首部的长度.
UDP(User Datagram Protocol,用户数据报协议)
首部结构相对简单,包含以下几个字段:
1.源端口(Source Port):占2字节,标识发送方的端口号。如果连接是无连接的,这个字段可以设置为0。
2.目的端口(Destination Port):占2字节,标识接收方的端口号。
3.长度(Length):占2字节,表示UDP数据报的总长度,包括首部和数据部分。
4.校验和(Checksum):占2字节,用于检测UDP数据报在传输过程中是否发生错误。校验和字段是可选的,但在实际应用中通常会使用。
UDP首部不包含序列号、确认号、流量控制或拥塞控制等信息,因为UDP是一种无连接的协议,它不提供像TCP那样的可靠传输服务.