首页 > 其他分享 >信息安全系统设计与实现——学习笔记11

信息安全系统设计与实现——学习笔记11

时间:2023-11-26 13:34:07浏览次数:32  
标签:11 addr IP 信息安全 笔记 server client printf include

任务详情:自学教材,提交学习笔记

Part1 知识点归纳&GPT提问

知识点归纳

1.TCP/IP协议
TCP/IP协议:TCP代表传输控制协议。 IP代表互联网协议。目前有两个版本的IP,即IPv4和IPv6,IPv4使用32位地址,IPv6使用128位地址。TCP/IP各个层级及使用的协议如下图所示:
image
2.IP
(1)IP协议
ip协议用于在ip主机之间发送/接收数据包,但IP协议并非可靠的协议,在IP层上面实现可靠性。

(2)IP主机和IP地址
主机是支持TCP/IP协议的计算机或设备。每个主机由一个32位的IP地址来标识。32位的IP地址号通常用点记法表示。IP地址分为两部分,即NetworkID字段和HostID字段。根据划分,IP地址分为A~E类,不同的类主机号和网络号所占位数不同。

(3)IP数据包格式
IP数据包包括IP头、发送方IP地址、接收方IP地址、数据、数据包的总长度、数据包使用TCP还是UDP、生存时间(TTL)计数、错误检测的校验和等。每个IP数据包的大小最大为64KB。具体格式如下图
image
4)路由器
路由器是接收和转发数据包的特殊IP主机,如果IP主机相距很远,需要借助路由器来转发数据包。每个IP包在1P报头中都有一个8位生存时间(TTL)计数,其最大值为255。在每个路由器上,TTL会减小1。如果TTL减小到0,而包仍然没有到达目的地,则会直接丢弃它。

3.UDP
UDP:用户数据报协议,在IP上运行,用于发送/接收数据报。UDP不能保证可靠性。我们常用的ping命令使用的协议就是UDP。

4.TCP
(1)TCP
传输控制协议,是一种面向连接的协议,用于发送/接收数据流。TCP也可在IP上运行,它保证可靠的数据传输。

(2)端口编号
在各主机上,多个应用程序(进程)可同时使用TCP/UDP.每个应用程序由三个组成部分唯一标识:应用程序=(主机IP,协议,端口号),协议是TCP或UDP,端口号是分配给应用程序的唯一无符号短整数。要想使用UDP或TCP,应用程序(进程)必须先选择或获取一个端口号。下图给出了常见的应用程序的默认端口号
image
5.网络和主机字节序
计算机可以使用大端字节序,也可以使用小端字节序。在互联网上,数据始终按网络序排列,就是大端。一些库函数比如htons()、htonl()、ntohs()、ntohl()等可以在主机序和网络序之间转换数据。

6.TCP/IP网络中的数据流
随着报文一层层下传,每一层都会在前面加上这一层专属的报头。在接收端恰恰相反,随着报文一层层上传,报头被每一层分别剥离以解析收到的数据。
image

7.套接字编程
(1)套接字API
在网络编程中,TCP/IP的用户界面是通过一系列C语言库函数和系统调用来实现的,这些函数和系统调用统称为套接字API。为了使用套接字API,我们需要套接字地址结构,它用于标识服务器和客户机。netdb.h和sys/socket.h中有 套接字地址结构的定义。套接字地址数据结构如下图:
image
服务器必须创建一个套接字,并将其与包含服务器IP地址和端口号的套接字地址绑定。客户机必须创建一个套接字。

(2)创建套接字
socket系统调用,2种创建套接字的方法

int 套接字(int 域,int 类型,int 协议)
int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
(3)UDP套接字
UDP套接字使用scndto()/recvfrom()来发送/接收数据报。image
(4)TCP套接字
在创建套接字并将其绑定到服务器地址之后,TCP服务器使用listen()和acccpt()来接收来自客户机的连接

int Iistcn(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, sockien_t *addrlen);
int connect(int sockfd, const struct sockaddr *addr, socklen t addrlen);
建立连接后,两个TCP主机都可以使用send()/write()发送数据,并使用recv()/read()接收数据。
image
8.主机名和IP地址
如果在不同的主机上运行服务器和客户机,服务器端口号由操作系统内核分配,则需要知道服务器的主机名或IP地址及其端口号。如果某台计算机运行TCP/IP,它的主机名通常记录在/etc/hosts文件中。库函数gethostname(char *name, sizeof(name))在name数组中返回计算机的主机名字符串。struct hostent *gethostbyname(void *addr, socklen_t len, int typo)可以用来获取计算机的全名及其IP地址。

GPT提问

套接字API

image

IP数据包格式

image

Part2 问题与解决思路

问题

运行了书上的UDP回显服务器-客户机程序,但是运行结果和书上的不太一样
image

GPT解决

image

Part3 实践过程截图

UDP回显服务器-客户机实践程序

server端代码

/**********TCPserver.c**********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define MAX  256
#define SERVER_HOST "localhost"
#define SERVER_PORT 1234
struct sockaddr_in server_addr;
int sock,r;

int client_init()
{
    printf("======= clinet init ==========\n"); 
    printf ("1 : create a TCP socket\n");
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock<0)
    {
        printf("socket call failed\n"); exit(1);
    }
    printf("2 : fill server_addr with server's IP and P0RT#\n"); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // localhost 
    server_addr.sin_port = htons(SERVER_PORT); // server port number    
    printf("3 : connecting to server ....\n");
    r = connect (sock, (struct sockaddr*)&server_addr, sizeof (server_addr)); 
    if (r < 0)
    {
        printf("connect failed\n"); 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);
        fgets(line, MAX, stdin);
        line[strlen(line)-1] = 0;
        if (line[0]==0) 
            exit(0);
        n = write(sock,line,MAX);
        printf("client:wrote n=%d bytes;line=%s\n", n, line);
        n = read(sock,ans,MAX);
        printf("client:read n=%d bytes;line=%s\n", n, ans);
    }
}
    

client代码

/**********TCPserver.c**********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define MAX  256
#define SERVER_HOST "localhost"
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 1234

struct sockaddr_in server_addr, client_addr;
struct in_addr client_addr_tranform;
int  mysock, csock;
int  r, len, n;

int server_init ()
{
    printf("================== server init ======================\n"); // create a TCP socket by socket() syscall
    printf("1 : create a TCP STREAM socket\n");
    mysock = socket(AF_INET, SOCK_STREAM, 0); 
    if (mysock < 0)
    {
        printf("socket call failed\n");
        exit(1);
    }
    printf("2 : fill server_addr with host IP and PORT# info\n");
    // initialize the server_addr structure
    server_addr.sin_family = AF_INET;	// for TCP/IP
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // This HOST IP 
    server_addr.sin_port = htons(SERVER_PORT);	// port number 1234
    printf("3 : bind socket to server address\n");
    r = bind(mysock,(struct sockaddr*)&server_addr,sizeof(server_addr)); 
    if (r < 0)
    {
        printf("bind failed\n"); 
        exit(3);
    }
    printf(" hostname = %s port = %d\n", SERVER_HOST, SERVER_PORT); 
    printf("4 : server is listening ....\n");
    listen(mysock, 5); // queue length = 5
    printf("=================== init done =======================\n"); 
}

int main()
{
    char line[MAX];
    server_init();
    client_addr_tranform.s_addr = client_addr.sin_addr.s_addr;
    while(1)	// Try to accept a client request
    {
        printf("server: accepting new connection ....\n");
        // Try to accept a client connection as descriptor newsock 
        len = sizeof(client_addr);
        csock = accept(mysock, (struct sockaddr *)&client_addr, &len);
        if (csock < 0)
        {
            printf("server: accept error\n"); exit(1);
        }
        printf("server: accepted a client connection from\n");
        printf ("-----------------------------------------\n");
        printf("Clinet: IP=%s port=%d\n", inet_ntoa(client_addr_tranform), ntohs(client_addr.sin_port));
        printf ("-----------------------------------------\n");
        while(1) 
        {
            n = read(csock, line, MAX);
            if (n==0)
            {
                printf("server: client died, server loops\n"); close(csock);
                break; 
            }
            printf("server: read n=%d bytes; line=%s\n", n, line); // echo line to client
            n = write(csock, line, MAX);
            printf("server:wrote n=%d bytes; ECHO=%s\n", n, line); 
            printf("server:ready for next request\n");
        }
    }
}



TCP回显服务器-客户机实践代码

server代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define MAX  256
#define SERVER_HOST "localhost"
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 1234

struct sockaddr_in server_addr, client_addr;
struct in_addr client_addr_tranform;
int  mysock, csock;
int  r, len, n;

int server_init ()
{
    printf("================== server init ======================\n"); // create a TCP socket by socket() syscall
    printf("1 : create a TCP STREAM socket\n");
    mysock = socket(AF_INET, SOCK_STREAM, 0); 
    if (mysock < 0)
    {
        printf("socket call failed\n");
        exit(1);
    }
    printf("2 : fill server_addr with host IP and PORT# info\n");
    // initialize the server_addr structure
    server_addr.sin_family = AF_INET;	// for TCP/IP
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // This HOST IP 
    server_addr.sin_port = htons(SERVER_PORT);	// port number 1234
    printf("3 : bind socket to server address\n");
    r = bind(mysock,(struct sockaddr*)&server_addr,sizeof(server_addr)); 
    if (r < 0)
    {
        printf("bind failed\n"); 
        exit(3);
    }
    printf(" hostname = %s port = %d\n", SERVER_HOST, SERVER_PORT); 
    printf("4 : server is listening ....\n");
    listen(mysock, 5); // queue length = 5
    printf("=================== init done =======================\n"); 
}

int main()
{
    char line[MAX];
    server_init();
    client_addr_tranform.s_addr = client_addr.sin_addr.s_addr;
    while(1)	// Try to accept a client request
    {
        printf("server: accepting new connection ....\n");
        // Try to accept a client connection as descriptor newsock 
        len = sizeof(client_addr);
        csock = accept(mysock, (struct sockaddr *)&client_addr, &len);
        if (csock < 0)
        {
            printf("server: accept error\n"); exit(1);
        }
        printf("server: accepted a client connection from\n");
        printf ("-----------------------------------------\n");
        printf("Clinet: IP=%s port=%d\n", inet_ntoa(client_addr_tranform), ntohs(client_addr.sin_port));
        printf ("-----------------------------------------\n");
        while(1) 
        {
            n = read(csock, line, MAX);
            if (n==0)
            {
                printf("server: client died, server loops\n"); close(csock);
                break; 
            }
            printf("server: read n=%d bytes; line=%s\n", n, line); // echo line to client
            n = write(csock, line, MAX);
            printf("server:wrote n=%d bytes; ECHO=%s\n", n, line); 
            printf("server:ready for next request\n");
        }
    }
}

client代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define MAX  256
#define SERVER_HOST "localhost"
#define SERVER_PORT 1234
struct sockaddr_in server_addr;
int sock,r;

int client_init()
{
    printf("======= clinet init ==========\n"); 
    printf ("1 : create a TCP socket\n");
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock<0)
    {
        printf("socket call failed\n"); exit(1);
    }
    printf("2 : fill server_addr with server's IP and P0RT#\n"); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // localhost 
    server_addr.sin_port = htons(SERVER_PORT); // server port number    
    printf("3 : connecting to server ....\n");
    r = connect (sock, (struct sockaddr*)&server_addr, sizeof (server_addr)); 
    if (r < 0)
    {
        printf("connect failed\n"); 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);
        fgets(line, MAX, stdin);
        line[strlen(line)-1] = 0;
        if (line[0]==0) 
            exit(0);
        n = write(sock,line,MAX);
        printf("client:wrote n=%d bytes;line=%s\n", n, line);
        n = read(sock,ans,MAX);
        printf("client:read n=%d bytes;line=%s\n", n, ans);
    }
}

Part4 其他

学习感悟
网络编程里的部分知识,比如TCP/IP结构、UDP协议、数据报等在上学期计算机网络里都学过,但是这次是要编程实现它。我觉得还是有点难度的。尤其是上节课学了指针函数、函数指针等的判别方法,我感觉我还是有点混淆,所以在理解一些库函数的时候有点困难。不过我也在借助一些资料学习。希望可以加深对网络编程的理解。

标签:11,addr,IP,信息安全,笔记,server,client,printf,include
From: https://www.cnblogs.com/wjmbk123/p/17856776.html

相关文章

  • ShardingSphere学习笔记
    MySQL7的root密码校验方式:mysql_native_passwordMySQL8的root密码校验方式:caching_sha2_password将mysql8的root密码校验方式改为7的:ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'123456'; 进入docker容器:防止中文显示乱码:dockerexec-itxxx-na......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第十一周学习总结 第十三章TCP/IP和网
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • django学习笔记06 查询
    查询库中某个字段的重复值并计数shufareadingcourse.objects.filter(lessonId=targetid[0]['id']).values('qtype').order_by().annotate(count=Count('qtype'))当数据库中有这样的数据,可以看到qtype会有不同类别,但是又会有重复,所以当查询时可以使用这种方式查询到有多少个LETTER......
  • 微信小程序开发周记(11.20-11.26)
    实现1:下拉生成颜色可以不断显示随机颜色。下拉刷新可以重置颜色列表,上拉触底可以延申显示内容。wxml:<!--pages/getc/getc.wxml--><buttontype="primary"bind:tap="navifunc">后退</button><viewclass="num-item"wx:for="{{colorList}}"wx:key=......
  • 20231126GESP三级笔记
    逛商场点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn,a[N],x,ans=0;intmain(){cin>>n;for(inti=1;i<=n;i++)cin>>a[i];cin>>x;for(inti=1;i<=n;i++){if(a[i]<=......
  • 2023-11-23-周二-又是浑浑噩噩的一天
    今日完成事项:Java基础复习,,,(没看出一个什么东西来)安卓开发(学习了一点点)今日消费:5.5+9.5+19=34感觉提不上神来,,,,也就是总想睡觉,想看手机,干活就懒惰得要命上午本来有课的,室友先走,我后走我走的时候已经很晚了可笑的是,,,当我走进教学楼,,还走错教室了本来是要......
  • 2023-11-26-周六-摆烂的一天
    早上8:50多就起床了...因为昨天晚上李涛约为打羽毛球...当时我并没有直接拒绝也没有答应,,,,,约的时间是周六9:00,打一小时的羽毛球,,,我也不知道为什么是打一个小时,,,早上8:50多在床上醒来后,我马上看看手机,,,,看李涛有没有发消息过来如果发消息了,就说明我9:00要去陪他打......
  • 学习笔记11
    TCP/IP和网络编程一、知识点归纳(一)网络编程简介如今,上网已成为日常生活的需要。虽然大多数人可能只把互联网作为一种信息收集、网上购物和社交媒体等的工具,但计算机科学的学生必须对互联网技术有一定的了解,并掌握一定的网络编程的技能。在本章中,我们将介绍TCP/IP网络和网络编程......
  • influxDB学习笔记
    InfluxDB行协议(LineProtocol)measurement(测量名称)TagSet(标签集)FieldSet(字段集):可指定类型,float,int,Boolean,timestamp,注释#TimeStamp(时间戳)e.g.parking,name=0num=50timeStamp(可省略,当前时间)parkingnum=50Prometheus数据格式:openMetris数据格式如何查询......
  • Docker部署思源笔记
    一、简介思源笔记是一款隐私优先的个人知识管理系统,支持细粒度块级引用和Markdown所见即所得。二、安装思源笔记绿联DX4600为例。首先我们打开Docker管理器,进入镜像管理。然后在镜像仓库中搜索b3log/siyuan​​,选择latest​​版本并下载。​​下载完成后,我们在本地镜......