学习笔记11

一、 任务详情

自学教材第13章,提交学习笔记(10分),评分标准如下

  1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

核心是要求GPT:“请你以苏格拉底的方式对我进行提问”

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

  1. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)

  2. 实践过程截图,代码链接(2分)

  3. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、知识点总结

1 . TCP/IP协议

TCP/IP(Comer 1988,2001;RFC1180 1991)是互联网的基础。TCP代表传输控制协议。IP 代表互联网协议。目前有两个版本的IP,即IPv4和IPv6。IPv4使用32位地址,IPv6则使用128位地址。本节围绕IPv4 进行讨论,它仍然是目前使用最多的IP版本。TCP/IP 的组织结构分为几个层级,通常称为TCP/IP堆栈。如图所示为 TCP/IP 的各个层级以及每一层级的代表性组件及其功能。

img

进程与主机之间的传输层或其上方的数据传输只是逻辑传输。实际数据传输发生在互联网(IP)和链路层,这些层将数据包分成数据帧,以便在物理网络之间传输。下图所示为 TCP/IP 网络中的数据流路径。

img

2 . IP主机和IP地址

  • 一个 IP地址的网络部分被称为网络号或者网络地址,主机可以与具有相同的网络号的设备直接通讯

  • IP地址是TCP/IP网络中用来唯一标识每台主机或设备的地址,IP地址由32位(共四个八位组)的二进制组成。IP地址分为两部分,左边网络编号部分用来标识主机所在的网络;右边部分用来标识主机本身,这部分称为主机地址。连接到同一网络的主机必须拥有相同的网络编号。

3. IP协议

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

  • 无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点就是无法处理乱序和重复的IP数据报。面向连接的协议,比如TCP协议,能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的、正确的。无状态服务的优点也很明显:简单、高效。我们无需为保持通信的状态而分配一些内核资源,也无需每次传输数据时都携带状态信息。

  • 无连接是指IP通信双方都不长久地维持对方的任何信息。这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

  • 不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力。很多情况都可以导致IP数据报发送失败。比如,某个中转路由器发现IP数据报在网络上存活地时间太长,那么它将丢弃该报文,并返回一个ICMP错误消息给发送端。因此,使用IP服务地上层协议需要自己实现数据确认、超时重传等机制以达到可靠传输的目的。

4 . ip数据包格式

img

5. 路由器的功能

路由器的功能就是将不同的子网之间的数据进行传递。 具体功能有以下几点:

  • 实现IP、TCP、UDP、ICMP等网络的互连。

  • 对数据进行处理。收发数据包,具有对数据的分组过滤、复用、加密、压缩及防护墙等各项功能。

  • 依据路由表的信息,对数据包下一传输目的地进行选择。

  • 进行外部网关协议和其他自治域之间拓扑信息的交换。

  • 实现网络管理和系统支持功能。 img

6. UDP/TCP

UDP(用户数据报协议)(RFC768 1980;Comer 1988)在IP上运行,用于发送/接收数据报。与IP类似,UDP不能保证可靠性,但是快速高效。它可用于可靠性不重要的情况。

TCP(传输控制协议)是一种面向连接的协议,用于发送/接收数据流。TCP也可在IP 上运行,但它保证了可靠的数据传输。通常,UDP类似于发送邮件的USPS,而TCP类似于电话连接。

7. 端口编号

应用程序 =(主机 IP,协议,端口号) 其中,协议是TCP或 UDP,端口号是分配给应用程序的唯一无符号短整数。要想使用UDP或 TCP,应用程序(进程)必须先选择或获取一个端口号。前1024个端口号已被预留。其他端口号可供一般使用。应用程序可以选择一个可用端口号,也可以让操作系统内核分配端口号。下图给出了在传输层中使用TCP 的一些应用程序及其默认端口号。

img

8. ping命令

Linux ping 命令用于检测主机。 执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。 img

9. 套接字

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。

struct sockaddr_in {
sa_family_t sin_family; // AF_INET for TCP/IP
in_port_t sin_port;  // port number
struct in_addr sin_addr;// IP address
};
struct in_addr {    // internet address
uint32_t  s_addr;  // IP address in network byte order
)

三、实验代码

1. 课上代码

13.15

Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> // Added inclusion of unistd.h for close function
#define MAX 256
#define SERVER_HOST "localhost"
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 1234 // Defined SERVER_PORT here
struct sockaddr_in server_addr, client_addr;
int mysock, csock;

void server_init() {
printf("================ server init =================\n");
// 1. Create a TCP socket
printf("1 : create a TCP socket\n");
mysock = socket(AF_INET, SOCK_STREAM, 0);
if (mysock < 0) {
perror("socket call failed");
exit(1);
}
// 2. Fill server_addr with server's IP and PORT#
printf("2 : fill server_addr with server's IP and PORT#\n");
memset((char*)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // Use localhost
server_addr.sin_port = htons(SERVER_PORT);
// 3. Bind socket to server address
printf("3 : bind socket to server address\n");
int r = bind(mysock, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (r < 0) {
perror("bind failed");
exit(3);
}
printf("hostname = %s port = %d\n", SERVER_HOST, SERVER_PORT);
printf("4 : server is listening ....\n");
// 4. Listen for incoming connections
listen(mysock, 5); // Queue length = 5
printf("================== init done ===============\n");
}
int main() {
int n;
char line[MAX];
server_init();
while (1) {
// Try to accept a client request
printf("server: accepting new connection ....\n");
socklen_t len = sizeof(client_addr);
csock = accept(mysock, (struct sockaddr*)&client_addr, &len);
if (csock < 0) {
  perror("server: accept error");
  exit(1);
  }
printf("server: accepted a client connection from\n");
printf("Client: IP=%s port=%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// Processing loop: client_sock <== data ==> client
while (1) {
  n = recv(csock, line, MAX, 0);
  if (n <= 0) {
    printf("server: client closed the connection, server loops\n");
    close(csock);
    break;
  }
    // Show the received line string
  printf("server: received n=%d bytes; line=%s\n", n, line);
  // Echo line to client
  n = send(csock, line, n, 0);
  printf("server: sent n=%d bytes; echo=%s\n", n, line);
  }
}
return 0;
}

Client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h> // Added inclusion of arpa/inet.h for bzero function
#define MAX 256
#define SERVER_HOST "localhost"
#define SERVER_PORT 1234
struct sockaddr_in server_addr;
int sock, r;
int client_init() {
printf("================ client init =================\n");
// 1. Create a TCP socket
printf("1 : create a TCP socket\n");
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
  perror("socket call failed");
  exit(1);
}
// 2. Fill server_addr with server's IP and PORT#
printf("2 : fill server_addr with server's IP and PORT#\n");
memset((char*)&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // Use localhost
server_addr.sin_port = htons(SERVER_PORT);
// 3. Connect to server
printf("3 : connecting to server ...\n");
r = connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (r < 0) {
perror("connect failed");
  exit(3);
}
printf("4 : connected OK to\n");
printf("-----------------------------\n");
printf("Server hostname=%s PORT=%d\n", SERVER_HOST, SERVER_PORT);
printf("-----------------------------\n");
printf("================ init done ================\n");
}
int main() {
int n;
char line[MAX], ans[MAX];
client_init();
printf("********** processing loop ************\n");
while (1) {
  printf("input a line : ");
  bzero(line, MAX); // Zero out line[]
  fgets(line, MAX, stdin); // Get a line from stdin
  line[strlen(line) - 1] = '\0'; // Kill \n at end
  if (line[0] == '\0') // Exit if NULL line
    exit(0);
  // Send line to server
  n = write(sock, line, MAX);
  printf("client: wrote n=%d bytes; line=%s\n", n, line);
  // Read a line from sock and show it
  n = read(sock, ans, MAX);
  printf("client: read n=%d bytes; echo=%s\n", n, ans);
}
return 0;

四、利用chatgpt

 

 
posted @ 2023-11-24 18:48  20211307李文婧  阅读(26)  评论(0)    收藏  举报