网络编程模型B/S模型browser/server浏览器/服务器1客户端为公用的客户端浏览器2一般只做服务器开发3客户端要加载的数据均来自服务器C/S模型client/server客户端/服务端1客户端是一个专用的客户端2服务器和客户端都需开发3客户端可保存资源本地加载无需所有数据都请求服务器UDPUDP传输层用户数据报协议UDP特点1面向数据报/数据包2无需建立连接3尽最大努力交付因此不安全不可靠因为可能造成数据丢包、乱序发送方发送太快对于接收方来说数据处理能力跟不上导致大量的数据在缓冲区积攒缓冲区满时数据便丢失4可实现一对一、一对多的传输5时效性高资源开销小机制简单数据实时性高效率高可靠性低例如VNC、直播如何避免UDP丢包1发送方以较慢的速度发送数据接收方又有足够的时间处理数据2模仿TCP机制应答机制网络抓包网络抓包抓取通过数倍网卡的网络数据从而调试和分析网络程序抓包工具wireshark使用1启动抓包工具sudo wireshark2选取要抓取的网卡----any所有3选取一个过滤条件4开始抓取5进行网络通信UDP报文头部分为四个字段1源端口号2字节发送方进程的端口号2目标端口号2字节接收方进程的端口号3长度2字节UDP发送的报文的整体长度包括UDP头部总共8字节和UDP正文部分4校验和2字节数据差错校验UDP编程流程套接字文件描述符是网络通信时应用层可操作的端口端口号用于区分应用层程序socket功能创建通信的套接字参数domin网络层使用什么地址协议族AF_INETIPv4AF_INET6IPv6type规定传输层的协议SOCK_DGRAM UDP协议SOCK_STREAMTCP协议SOCK_RAW 原始套接字protocol0为按照默认协议方式创建返回值成功则为套接字文件描述符失败则为-1sendto功能向网络套接字发送数据参数sockfd套接字buf要发送的数据的首地址len要发送的字节数flags0为按照默认方式发送dest_addr接收方的地址信息IP 端口号man 7 ip参数要求const struct sockaddr *直接取地址并强转即可由于历史原因sockaddr_in就是sockaddr但还是需要进行类型转换sin_family地址协议族sin_port端口号必须是网络字节序大端由于主机字节序是小端所以需要进行转化由函数htonssin_addrIP地址与端口号同理需要转网络字节序即inet_addraddrlen接收方的地址大小返回值成功则为实际发送的字节数失败则为-1例bind功能绑定自己的IP地址和端口号参数sockfd套接字addr需要绑定的地址addrlen地址大小返回值成功则0失败-1recvfrom功能从套接字上接收数据参数sockfd套接字buf存放接收数据的内存首地址len希望接收的字节数flags0为按照默认阻塞方式回收src_addr发送方的地址信息提前定义变量来存如果不关注为NULLaddrlen发送方地址长度的指针如果不关注为NULL返回值成功则为实际收到的字节数失败则为-1示例服务端客户端TCPTCP特点1面向数据流2通信之前必须建立链接3安全可靠的应答机制但是效率低4机制复杂网络资源开销大5本质只能实现一对一的通信使用TCP并发方式可以实现一对多TCP三次握手和四次挥手机制三次握手TCP建立连接时需要进行三次握手为了确保收发双方通信之前都已准备就绪客户端会向服务端发送一包数据这包数据里有一个明显的标志位SYN请求建立联系标服务端接收到之后会给对方回应一个ACK响应报文标志位和SYN最后客户端再回ACK谁先发都行号四次挥手TCP断开连接时。需要进行四次挥手确保断开连接前双方都已通信结束谁先发FIN都行而后发的ACK和FIN不能像三次握手一样同时发因为接收到客户端FIN并给予ACK回应时并不代表服务端也要断开连接例如有些数据没有收发完成如果同时发就表示同时断开连接TCP编程流程服务端在创建监听套接字sockfd之后调用listen时listen会在后台创建两个队列负责保存待完成三次握手的客户端A和已完成三次握手的客户端B若有客户端请求建立连接但未完全建立连接则该客户端信息会保存在A中再来客户端就继续保存当有客户端已完全建立连接则该客户端信息则会出队被保存在B中connect功能请求与服务端建立连接参数sockfd套接字addr要连接的服务端地址信息addrlen服务端地址大小返回值成功则0失败-1send功能发送网络数据参数sockfd网络套接字buf要发送的数据首地址len发送的字节数flags0则按照默认方式发送MSG_OOB为紧急数据且recv中也需要对应这个宏返回值成功则为实际发送的字节数失败则为-1listen功能监听建立三次握手的客户端参数sockfd监听套接字backlog最大允许监听的客户端个数即未完成三次握手的客户端个数已完成的不算返回值成功则0失败-1accept功能阻塞等待接收建立三次握手的客户端并产生一个通讯套接字参数sockfd监听套接字address已完成三次握手的客户端的地址信息需自己定义address_len客户端地址长度的指针如果不关注客户端后两者可以设置为NULL返回值成功则为通讯套接字失败则为-1recv功能从套接字上接收数据参数sockfd通讯套接字buf存放接收数据的首地址len期望接收到的字节数flag0则为默认方式返回值成功则为实际接到的字节数失败-1。如果对方断开连接则为0示例客户端服务端这里在“已断开连接”下还有一行其实这是fgets的阻塞效果属于正常现象可以通过终止信号等方式消除这种现象TCP存在的问题——粘包问题发送方应用层发送的多包数据将来在接收方可能一次读到多包数据产生了粘连造成问题的原因1. 发送方速度较快TCP底层可能对多包数据进行重新组帧2. 接收方数据处理速度较慢导致多包数据在接收缓冲区缓存应用层读时一次将多包数据读出解决方法1调整发送速率2.发送指定大小接收方也指定大小例如结构体注意如果是跨平台之间的数据传输需要注意结构体对齐问题比如32bits平台和64位bit平台3应用层为发送的数据增加分隔符\n利用分隔符解析4封装自定义数据帧格式进行发送协议严格根据协议进行解析例十六进制AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB帧头AA len上例C0为数据的长度为了防止同时出现与帧尾帧头相同的数据帧尾BB有效数据长度C0有效数据00 00 00 F0 00 BB 10 A0 00 00 00 10校验8位和校验16位和校验CRC校验为了验证数据传送过程中是否出现问题以8位和校验为例从帧头开或者有效数据始后一个字节一直加到校验之前的数据一个字节一个字节的加起来得到的数的第八个bit作为校验和TCP的其他机制TCP头部标志位固定头部20个字节SYN请求建立连接标志位ACK响应报文标志位PSH携带数据标志位通知接收方该从缓冲区读数据FIN请求断开连接标志位RST复位标志位请求重连URG紧急数据紧急指针偏移量指出紧急数据的最后一个字节的位置机制其中1234为了安全可靠567为了效率1应答机制TCP对于每一包数据都会给出相应的应答。发送数据时序列号表示这包数据的其实编号响应报文中的确认号是接收方受到的最后一个字节编号12三次握手和四次挥手机制3超时重传机制数据发送出去等待指定时间没有收到相应此时认为这包数据丢置则进行重传4. 滑动窗口机制拥塞机制一段缓冲区缓存TCP已发送未收到响应准备发送等数据5流量控制机制结合TCP头部的窗口大小动态调整发送速率与拥塞机制有关6捎带应答机制ACK报文可能和应用层的数据同时发送7延迟应答机制发送数据的同时可以等待应答
Linux系统编程——传输层网络协议
发布时间:2026/5/21 15:59:28
网络编程模型B/S模型browser/server浏览器/服务器1客户端为公用的客户端浏览器2一般只做服务器开发3客户端要加载的数据均来自服务器C/S模型client/server客户端/服务端1客户端是一个专用的客户端2服务器和客户端都需开发3客户端可保存资源本地加载无需所有数据都请求服务器UDPUDP传输层用户数据报协议UDP特点1面向数据报/数据包2无需建立连接3尽最大努力交付因此不安全不可靠因为可能造成数据丢包、乱序发送方发送太快对于接收方来说数据处理能力跟不上导致大量的数据在缓冲区积攒缓冲区满时数据便丢失4可实现一对一、一对多的传输5时效性高资源开销小机制简单数据实时性高效率高可靠性低例如VNC、直播如何避免UDP丢包1发送方以较慢的速度发送数据接收方又有足够的时间处理数据2模仿TCP机制应答机制网络抓包网络抓包抓取通过数倍网卡的网络数据从而调试和分析网络程序抓包工具wireshark使用1启动抓包工具sudo wireshark2选取要抓取的网卡----any所有3选取一个过滤条件4开始抓取5进行网络通信UDP报文头部分为四个字段1源端口号2字节发送方进程的端口号2目标端口号2字节接收方进程的端口号3长度2字节UDP发送的报文的整体长度包括UDP头部总共8字节和UDP正文部分4校验和2字节数据差错校验UDP编程流程套接字文件描述符是网络通信时应用层可操作的端口端口号用于区分应用层程序socket功能创建通信的套接字参数domin网络层使用什么地址协议族AF_INETIPv4AF_INET6IPv6type规定传输层的协议SOCK_DGRAM UDP协议SOCK_STREAMTCP协议SOCK_RAW 原始套接字protocol0为按照默认协议方式创建返回值成功则为套接字文件描述符失败则为-1sendto功能向网络套接字发送数据参数sockfd套接字buf要发送的数据的首地址len要发送的字节数flags0为按照默认方式发送dest_addr接收方的地址信息IP 端口号man 7 ip参数要求const struct sockaddr *直接取地址并强转即可由于历史原因sockaddr_in就是sockaddr但还是需要进行类型转换sin_family地址协议族sin_port端口号必须是网络字节序大端由于主机字节序是小端所以需要进行转化由函数htonssin_addrIP地址与端口号同理需要转网络字节序即inet_addraddrlen接收方的地址大小返回值成功则为实际发送的字节数失败则为-1例bind功能绑定自己的IP地址和端口号参数sockfd套接字addr需要绑定的地址addrlen地址大小返回值成功则0失败-1recvfrom功能从套接字上接收数据参数sockfd套接字buf存放接收数据的内存首地址len希望接收的字节数flags0为按照默认阻塞方式回收src_addr发送方的地址信息提前定义变量来存如果不关注为NULLaddrlen发送方地址长度的指针如果不关注为NULL返回值成功则为实际收到的字节数失败则为-1示例服务端客户端TCPTCP特点1面向数据流2通信之前必须建立链接3安全可靠的应答机制但是效率低4机制复杂网络资源开销大5本质只能实现一对一的通信使用TCP并发方式可以实现一对多TCP三次握手和四次挥手机制三次握手TCP建立连接时需要进行三次握手为了确保收发双方通信之前都已准备就绪客户端会向服务端发送一包数据这包数据里有一个明显的标志位SYN请求建立联系标服务端接收到之后会给对方回应一个ACK响应报文标志位和SYN最后客户端再回ACK谁先发都行号四次挥手TCP断开连接时。需要进行四次挥手确保断开连接前双方都已通信结束谁先发FIN都行而后发的ACK和FIN不能像三次握手一样同时发因为接收到客户端FIN并给予ACK回应时并不代表服务端也要断开连接例如有些数据没有收发完成如果同时发就表示同时断开连接TCP编程流程服务端在创建监听套接字sockfd之后调用listen时listen会在后台创建两个队列负责保存待完成三次握手的客户端A和已完成三次握手的客户端B若有客户端请求建立连接但未完全建立连接则该客户端信息会保存在A中再来客户端就继续保存当有客户端已完全建立连接则该客户端信息则会出队被保存在B中connect功能请求与服务端建立连接参数sockfd套接字addr要连接的服务端地址信息addrlen服务端地址大小返回值成功则0失败-1send功能发送网络数据参数sockfd网络套接字buf要发送的数据首地址len发送的字节数flags0则按照默认方式发送MSG_OOB为紧急数据且recv中也需要对应这个宏返回值成功则为实际发送的字节数失败则为-1listen功能监听建立三次握手的客户端参数sockfd监听套接字backlog最大允许监听的客户端个数即未完成三次握手的客户端个数已完成的不算返回值成功则0失败-1accept功能阻塞等待接收建立三次握手的客户端并产生一个通讯套接字参数sockfd监听套接字address已完成三次握手的客户端的地址信息需自己定义address_len客户端地址长度的指针如果不关注客户端后两者可以设置为NULL返回值成功则为通讯套接字失败则为-1recv功能从套接字上接收数据参数sockfd通讯套接字buf存放接收数据的首地址len期望接收到的字节数flag0则为默认方式返回值成功则为实际接到的字节数失败-1。如果对方断开连接则为0示例客户端服务端这里在“已断开连接”下还有一行其实这是fgets的阻塞效果属于正常现象可以通过终止信号等方式消除这种现象TCP存在的问题——粘包问题发送方应用层发送的多包数据将来在接收方可能一次读到多包数据产生了粘连造成问题的原因1. 发送方速度较快TCP底层可能对多包数据进行重新组帧2. 接收方数据处理速度较慢导致多包数据在接收缓冲区缓存应用层读时一次将多包数据读出解决方法1调整发送速率2.发送指定大小接收方也指定大小例如结构体注意如果是跨平台之间的数据传输需要注意结构体对齐问题比如32bits平台和64位bit平台3应用层为发送的数据增加分隔符\n利用分隔符解析4封装自定义数据帧格式进行发送协议严格根据协议进行解析例十六进制AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB帧头AA len上例C0为数据的长度为了防止同时出现与帧尾帧头相同的数据帧尾BB有效数据长度C0有效数据00 00 00 F0 00 BB 10 A0 00 00 00 10校验8位和校验16位和校验CRC校验为了验证数据传送过程中是否出现问题以8位和校验为例从帧头开或者有效数据始后一个字节一直加到校验之前的数据一个字节一个字节的加起来得到的数的第八个bit作为校验和TCP的其他机制TCP头部标志位固定头部20个字节SYN请求建立连接标志位ACK响应报文标志位PSH携带数据标志位通知接收方该从缓冲区读数据FIN请求断开连接标志位RST复位标志位请求重连URG紧急数据紧急指针偏移量指出紧急数据的最后一个字节的位置机制其中1234为了安全可靠567为了效率1应答机制TCP对于每一包数据都会给出相应的应答。发送数据时序列号表示这包数据的其实编号响应报文中的确认号是接收方受到的最后一个字节编号12三次握手和四次挥手机制3超时重传机制数据发送出去等待指定时间没有收到相应此时认为这包数据丢置则进行重传4. 滑动窗口机制拥塞机制一段缓冲区缓存TCP已发送未收到响应准备发送等数据5流量控制机制结合TCP头部的窗口大小动态调整发送速率与拥塞机制有关6捎带应答机制ACK报文可能和应用层的数据同时发送7延迟应答机制发送数据的同时可以等待应答