为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
讨论题

jelasin 的学生作业:

三次握手的过程: 第一次握手:客户端发送SYN报文段,序列号为x 第二次握手:服务器回复SYN+ACK报文段,确认号为x+1,序列号为y 第三次握手:客户端发送ACK报文段,确认号为y+1 三次握手的必要性: 确认双方的收发能力 第一次握手:确认客户端发送能力、服务器接收能力 第二次握手:确认服务器发送能力、客户端接收能力 第三次握手:再次确认客户端发送能力、服务器接收能力 防止旧连接请求的干扰 场景:客户端发送连接请求A,网络延迟导致超时重发请求B 如果只有两次握手: - 请求B先到达并建立连接 - 连接结束后,延迟的请求A到达 - 服务器误认为这是新的连接请求并建立连接 - 造成资源浪费 三次握手解决方案: - 即使旧请求A到达,服务器发送SYN+ACK - 但客户端已经处理完连接B,会忽略这个响应 - 没有第三次握手,连接不会建立 同步序列号 双方需要交换初始序列号,用于后续的数据传输和确认。 四次挥手的过程: 第一次挥手:客户端发送FIN报文段 第二次挥手:服务器发送ACK确认 第三次挥手:服务器发送FIN报文段 第四次挥手:客户端发送ACK确认 四次挥手的原因: TCP是全双工通信 建立连接时: - 一个SYN+ACK可以同时完成"同意连接"和"发送自己的连接请求" 断开连接时: - 收到FIN只能确认对方要关闭发送方向 - 但自己可能还有数据要发送 - 所以ACK(确认)和FIN(关闭)必须分开 数据传输的完整性 // 服务器端的处理逻辑 recv_FIN_from_client() { send_ACK(); // 第二次挥手:确认收到客户端的FIN // 此时可能还有数据要发送给客户端 while(has_data_to_send()) { send_data(); } send_FIN(); // 第三次挥手:发送自己的FIN } 状态转换的需要 客户端状态:ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED 服务端状态:ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

得分 100
学习任务

jelasin 的学生作业:

seq (Sequence Number) - 序列号 含义: 32位字段,标识发送方发送的数据字节流中第一个字节的序号 作用: 确保数据的有序性和完整性 理解: 就像给每个数据包编号,接收方可以按正确顺序重组数据。即使网络中数据包乱序到达,也能正确还原原始数据流 ack (Acknowledgment Number) - 确认号 含义: 32位字段,表示期望接收的下一个序列号 作用: 告诉发送方"我已经收到了序号X之前的所有数据,请发送序号X的数据" 理解: 这是一种"累积确认"机制,不仅确认当前包,还确认之前所有包都已正确接收 ACK (Acknowledgment Flag) - 确认标志位 含义: 1位标志位,当设置为1时表示ack字段有效 作用: 指示该TCP段是否携带有效的确认信息 理解: 只有当ACK=1时,接收方才会处理ack字段。除了连接建立的第一个SYN包,几乎所有TCP包都会设置ACK标志 SYN (Synchronize Flag) - 同步标志位 含义: 1位标志位,用于建立连接时的序列号同步 作用: 发起连接请求,同步双方的初始序列号 理解: TCP三次握手的核心。客户端发送SYN=1开始连接,服务器回复SYN=1,ACK=1,最后客户端确认ACK=1 FIN (Finish Flag) - 结束标志位 含义: 1位标志位,表示发送方没有更多数据要发送 作用: 优雅地关闭TCP连接 理解: 相当于说"我的话说完了",但连接还没完全断开,需要等对方也发送FIN才能完全关闭

得分 100
学习任务

jelasin 的学生作业:

网络层判断 当主机A要与主机B通信时,首先通过子网掩码(通常是255.255.255.0)判断目标主机是否在同一网段: A的网络地址: 192.168.0.88 & 255.255.255.0 = 192.168.0.0 B的网络地址: 192.168.0.66 & 255.255.255.0 = 192.168.0.0 结果相同,确认在同一局域网内。 ARP地址解析 由于是同网段通信,主机A需要获取主机B的MAC地址: ARP缓存查询:首先检查本地ARP表(arp -a命令可查看) ARP请求:如果缓存中没有,发送ARP广播请求 源MAC: A的MAC地址 目标MAC: FF:FF:FF:FF:FF:FF (广播) ARP请求: "谁是192.168.0.66?请告诉192.168.0.88" ARP应答:主机B收到后单播回复自己的MAC地址 数据封装过程 应用层数据经过协议栈逐层封装: 应用层 | HTTP/SSH/FTP等应用数据 传输层 | TCP/UDP头部 + 应用数据 网络层 | IP头部 + TCP/UDP数据 数据链路层| 以太网头部 + IP数据 + FCS校验 物理层 | 电信号/光信号传输 二层交换转发 数据帧到达交换机后: MAC地址学习:交换机学习源MAC地址和对应端口 CAM表查询:查找目标MAC地址对应的端口 单播转发:如果找到则单播转发,否则洪泛到所有端口 接收端处理 主机B收到数据帧后: MAC地址过滤:网卡检查目标MAC是否匹配 逐层解封装:从数据链路层到应用层逐层剥离头部 应用层处理:最终将数据交给对应的应用程序

得分 100
学习任务

浪潮君 的学生作业:

#include // 标准输入输出函数,如 printf、perror #include // 标准库函数,如 malloc、exit #include // 字符串处理函数,如 memset #include // UNIX 系统调用,如 close #include // 提供网络字节序、地址转换函数 #include // 提供 socket、bind、listen 等 API // ======================================================================= // 函数名称:tcp_socket_create // 函数功能:封装 TCP 服务端 socket 的创建、绑定和监听过程 // 输入参数: // ip —— 要绑定的 IP 字符串,如 “0.0.0.0” // port —— 要监听的端口号,如 8888 // backlog —— 最大等待连接队列长度 // 返回值:成功返回监听 socket 文件描述符;失败返回 -1 并打印错误信息 // ======================================================================= int tcp_socket_create(const char *ip, int port, int backlog) { int sockfd; struct sockaddr_in addr; // 1. 创建 TCP socket(使用 IPv4 + 面向连接) sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return -1; } // 2. 设置 socket 选项 —— 允许端口复用(防止 TIME_WAIT 占用) int opt = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { perror("setsockopt 设置失败"); close(sockfd); return -1; } // 3. 清零地址结构体,并配置 IP + 端口 + 协议族 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; // IPv4 addr.sin_port = htons(port); // 主机字节序 → 网络字节序 // 将字符串形式的 IP 转换为网络地址结构(支持 127.0.0.1, 0.0.0.0 等) if (inet_pton(AF_INET, ip, &addr.sin_addr)

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号