Berbagi teknologi

Pemrograman Jaringan: Konsep Dasar

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1.model OSI

Model OSI ===》Model Interkoneksi Sistem Terbuka ==》dibagi menjadi 7 lapisan:
Model ideal ==》Belum terealisasi
tftp
b /etc/passwd
sebuah /etc/123
Lapisan aplikasi
Enkripsi dan dekripsi lapisan presentasi gzip
Pemutusan jaringan lapisan sesi, status koneksi, tetap tutup tetap hidup

Lapisan transport file protokol tcp udp video, audio
Lapisan jaringan ip NAT

Pemeriksaan bingkai pemformatan data peralihan lapisan tautan
Lapisan fisik 100Mb/8 Gbit kabel koaksial 100MB 10Gb 2.4G 5G

Dari bawah ke atas, yang paling bawah adalah yang paling dasar

2. Model TCP/IP

Model TCP/IP ==》Model Internet ==》dibagi menjadi 4 lapisan:
Model Praktis ===》Standar Industri
tumpukan protokol tcp/ip
Lapisan aplikasi ====》Aplikasi
Lapisan transport ====》Nomor port tcp udp (metode transmisi mana yang digunakan,tcp dapat diandalkanUDP memiliki kinerja real-time yang tinggi
Lapisan jaringan ====》alamat IP (Bagaimana menemukan pihak lain dan menjadi tuan rumah
Lapisan antarmuka ====》Driver kartu jaringan 1GB
pcap ,,,

3. Rangkaian protokol TCP/IP

www.taobao.com ---> 192.168.0.19
www.voa.com vpn
Resolusi nama domain DNS (umumnya berdasarkan provinsi)


DHCP (Protokol Konfigurasi Host Dinamis)
Lapisan aplikasi:HTTP (halaman web) TFTP (transfer file jarak pendek yang sepele)FTP (Transfer Internet jarak jauh)
                   SNMP (Mengelola dan memantau perangkat jaringan, sistem dan aplikasi)... DNS ...
Lapisan transportasi: TCP UDP 56k cat
Lapisan jaringan: IP ICMP (ping) RIP OSPF IGMP...
Lapisan antarmuka: ARP (Protokol Resolusi Alamat) RARP... ip--->mac
arp,,,,
    192.160.0.112 


1. Dasar-dasar Jaringan

Dasar-Dasar Jaringan ===》Kelas ABCDE
010  3333344444
Alamat IP == bit jaringan + bit host

Klasifikasi alamat IP: desimal bertitik ipv4 712934
    Kategori A: Jaringan berskala sangat besar
                          8    8     8    8
        1.0.0.0 - 126.255.255.255  126.1.1.1 
        ID Jaringan                                126.1.1.2
       255.0.0.0 (subnetmask)  
pribadi:
        10.0.0.0 - 10.255.255.255
        127.0.0.1
    Kategori B: Jaringan besar dan menengah
        128.0.0.0 - 191.255.255.255
        128.2.1.2  128.2.7.2
        255.255.0.0
pribadi:
        172.16.0.0 - 172.31.255.255

   Kategori C: Jaringan kecil dan menengah
       192.0.0.0 - 223.255.255.255
        255.255.255.0
pribadi:
       192.168.0.0 - 192.168.255.255
Perutean statis
        192.168.0.0
        gerbang 192.168.0.1
        192.168.0.255 (Siaran, semua orang di LAN dapat menerimanya)

   Kategori D: Multicast dansiaran
        224.0.0.0 - 239.255.255.255 (Obrolan grup, tidak terbuka untuk semua orang, tidak terbatas pada LAN)
        192.168.0.255 == 255.255.255.255 (hanya LAN, satu orang mengirim, semua orang menerima)
        235.1.2.3
        192.168.1.0 
192.168.0.1 Gerbang
192.168.1.255 Siaran

Kategori E: Eksperimental
        240.0.0.0 - 255.255.255.255
        
Jaringan Kelas C:
Tiga kelompok pertama dari alamat IP adalah alamat jaringan, dan kelompok keempat adalah alamat host.
Bit biner tertinggi harus: dimulai dengan 110xxxxx
Rentang representasi desimal: 192.0.0.0 -223.255.255.255
Masker jaringan bawaan: 255.255.255.0
Jumlah jaringan: 2^24, sekitar 2,09 juta
Jumlah host: 2^8 254 + 2 ===》1 adalah gateway 1 disiarkan
Alamat pribadi: alamat LAN 192.168.xx.
  
  sudo vim/etc/network/interfaces "Konfigurasi jaringan"
sudo /etc/init.d/jaringan restart
sudo mulai ulang
    192.168.0.0
rute 192.168.0.1
192.168.0.255 papan siaran
801.ng
Konfigurasi untuk akses Internet satu mesin:
1. Miliki antarmuka jaringan dan colokkan kabel jaringan.
2. Memiliki alamat IP
3. Konfigurasikan pengaturan jaringan
           ip (ubah ip sementara): ifconfig ethX XXXX/24 hingga ifconfig ens33 192.168.0.13/24 (subnetmask) naik 255.255.255.0
Gerbang: rute tambahkan default gw xxxx
DNS: vi /etc/resolv.conf ==>nameserver 8.8.8.8
            Tes: ping www.baidu.com
            bersihstatus -anp (dapat melihat status jaringan komputer)

2. Antarmuka jaringan

1. soket soket (Deskriptor file - perangkat jaringan terkait) ==》Soket BSD ==》Satu set fungsi antarmuka untuk komunikasi jaringan.stopkontak api  antarmuka fungsi antarmuka aplikasi
        2. aku p+pelabuhan alamat+pelabuhan===》Alamatnya duluIdentifikasi tuan rumah
Pelabuhan yang digunakanIdentifikasi aplikasi

          Port dibagi menjadi port TCP/port UDP, kisarannya adalah: 1-65535
Disepakati bahwa port dalam 1000 digunakan oleh sistem.
http 80 www.baidu.com
                3306
telepon 21
ssh22

3. Urutan byte jaringan

        Penyimpanan big endian (bit rendah dalam memori tinggi - perangkat jaringan)
     Little endian 0x12345678 (bit rendah dalam memori rendah - host)
        12 00   
        00 12
        192.168.0.12 (big-endian) "bit paling signifikan disimpan terlebih dahulu"
       12.0.168.192 (little endian)

4. UDP (Datagram Pengguna)

1. Fitur: Tidak ada tautan, tidak dapat diandalkan, data besar

2. Kerangka: mode C/S

server: soket() ===>bind()===>recvfrom()===>tutup()
klien: socket() ===>bind()===>sendto() ===>close()

Catatan: Parameter socket() perlu disesuaikan.

soket(PF_INET,SOCK_DGRAM,0);

      bind() klien(c) adalah opsionalSisi server diperlukan

1.soket

soket int(domain int, tipe int, protokol int);
Fungsi: Program mengusulkan ke kernelBuat deskriptor soket berbasis memori

parameter:keluarga alamat domain, PF_INET == AF_INET ==>Program Internet
PF_UNIX == AF_UNIX ==>program yang berdiri sendiri

          jenis jenis soket:
Soket streaming SOCK_STREAM ===》TCP
SOCK_DGRAM Soket Datagram Pengguna ===>UDP
Soket mentah SOCK_RAW ===》IP

          protokol protokol ==》0 berarti secara otomatis beradaptasi dengan protokol lapisan aplikasi.

Nilai pengembalian: Pengembalian berhasilID soket yang diminta
Kegagalan -1;

2.mengikat

int mengikat(int kaus kaki, struct sockaddr *alamat_sayaalamat socklen_t);
Fungsi: Jika fungsi tersebut masukTerminal LayananDisebut, artinya mengaitkan file deskriptor file yang terkait dengan parameter 1 dengan alamat antarmuka yang ditentukan oleh parameter 2 untukTerima data dari antarmuka ini

Jika fungsinya masukLagu klienJika digunakan berarti data harus diambil dari deskriptor tempat parameter 1 berada dan dari perangkat antarmuka tempat parameter 2 berada. mengirimkan

Catatan: Jika klien, fungsi ini dapat dihilangkan dan data akan dikirim melalui antarmuka default.
parameter:deskriptor file sockfd dan id soket yang sebelumnya dibuat melalui fungsi soket
          my_addr adalah penunjuk struktur antarmuka fisik.Mewakili informasi tentang antarmuka

struct sockaddr struktur alamat universal
      {
u_short sa_family; alamat keluarga
char sa_data[14]; informasi alamat
      };

Struktur alamat jaringan yang dikonversi adalah sebagai berikut:
struct _sockaddr_in ///Struktur alamat jaringan
      {
u_short sin_family; alamat keluarga
u_short sin_port; ///Alamat port
struct in_addr sin_addr; ///Alamat IP
char sin_zero[8];
      };

struktur di_alamat
      {
di_alamat_t s_alamat;
      }

socklen_t addrlen: panjang parameter 2.
Nilai pengembalian: sukses 0
Kegagalan -1;

3.Kirimmengambil alihfungsi:

ssize_t kirim ke(int kaus kaki, konstanta void *buf, ukuran_t panjang,bendera int,
                       
konstanta struct sockaddr *dest_addr, alamat socklen_t);

Fungsi: Digunakan untuk mengirim pesan ke pihak lain dalam protokol UDPmengirim data
parameter:id soket lokal sockfd
           buff penyimpanan data lokal, biasanya data yang akan dikirim
          len panjang data yang akan dikirim
          tandai Cara mengirim data,0 berarti memblokir pengiriman

          dest_addr: diperlukan, menunjukkan struktur informasi host target yang akan dikirimi
        addrlen: panjang alamat target

Nilai pengembalian: Panjang data berhasil terkirim
Kegagalan -1;


ssize_t diterima dari(int kaus kaki, batal *buf, ukuran_t panjang, bendera int,
                          
struktur sockaddr *src_addr, socklen_t *alamat_);

Fungsi: digunakan dalam protokol UDPMemperolehData yang dikirim oleh pihak lain.
parameter:id soket lokal sockfd
          buff Area memori tempat data disimpan, biasanya berupa array atau memori dinamis
        len adalah panjang data yang ingin diperoleh, biasanya ukuran buff.
           metode perolehan bendera,0 pemblokiran

          src_addr bersifat opsional dan mewakili struktur informasi alamat pihak lainBATAL,cepatJangan pedulikan alamat pihak lain
          addrlen Ukuran struktur informasi alamat pihak lain, jikaAlamat pihak lainYaTIDAKAku, kalau begituNilai ini juga NULL
Nilai kembalian: panjang data yang berhasil diterima
Kegagalan -1;

4.Tutup

menutup() ===>Tutup id soket yang ditentukan;


Melihat

1. Data dan data mempunyai batasan
2. Jumlah pengiriman dan penerimaan harus sesuai
3.recvfrom akan memblokir
4.sento tidak akan diblokir (recvfrom tidak menerima, tidak mempengaruhi pengiriman sento) 


   c mencari s

server.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <time.h>
  10. typedef struct sockaddr *SA;
  11. int main(int argc, char *argv[])
  12. {
  13. int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字
  14. if(-1 == sockfd) // 检查socket调用是否失败
  15. {
  16. perror("socket"); // 打印错误信息
  17. exit(1); // 退出程序
  18. }
  19. // 定义服务器地址和客户端地址结构体(尽管客户端地址通常在recvfrom中填充)
  20. struct sockaddr_in ser, cli;
  21. bzero(&ser, sizeof(ser)); // 初始化服务器地址结构体
  22. bzero(&cli, sizeof(cli)); // 初始化客户端地址结构体(但这里实际上不需要提前初始化)
  23. // 设置服务器地址结构体
  24. ser.sin_family = AF_INET;
  25. ser.sin_port = htons(50000); // 端口号转换为网络字节序
  26. ser.sin_addr.s_addr = inet_addr("192.168.203.128"); // 服务器IP地址
  27. // 将套接字绑定到服务器地址和端口
  28. int ret = bind(sockfd, (SA)&ser, sizeof(ser));
  29. if(-1 == ret)
  30. {
  31. perror("bind"); // 绑定失败时打印错误信息
  32. exit(1); // 退出程序
  33. }
  34. socklen_t len = sizeof(cli); // 用于recvfrom的客户端地址长度
  35. // 无限循环接收数据并发送响应
  36. while(1)
  37. {
  38. char buf[512] = {0}; // 准备接收数据的缓冲区
  39. // 接收数据,注意这里&len是必需的,因为recvfrom会修改它以反映实际接收到的客户端地址长度
  40. recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);
  41. time_t tm;
  42. time(&tm); // 获取当前时间
  43. // 这里有一个问题:buf被用于接收数据,然后又被用于存储新的字符串(包括原始数据和时间戳)
  44. // 这会导致原始数据被覆盖。应该使用另一个缓冲区来存储最终的发送数据
  45. sprintf(buf, "%s %s", buf, ctime(&tm)); // 将时间戳附加到接收到的数据上
  46. // 发送数据回客户端,但注意len在这里已经被recvfrom修改,表示客户端地址的长度
  47. // 对于sendto,我们应该使用sizeof(cli)或重新初始化len
  48. sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, len); // 这里使用len可能不是最佳实践
  49. }
  50. // 注意:由于程序进入了一个无限循环,下面的close和return语句实际上永远不会被执行
  51. close(sockfd); // 正常情况下应该关闭套接字
  52. return 0; // 程序正常结束
  53. }

klien.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h> /* See NOTES */
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <netinet/ip.h>
  9. #include <arpa/inet.h>
  10. #include <time.h>
  11. // 定义一个类型别名SA,指向sockaddr结构体
  12. typedef struct sockaddr *SA;
  13. // 注意:它尝试定义一个函数指针类型而不是简单的结构体指针。
  14. int main(int argc, char *argv[])
  15. {
  16. // 创建一个UDP套接字
  17. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  18. if(-1 == sockfd)
  19. {
  20. perror("socket"); // 如果创建套接字失败,打印错误信息
  21. exit(1); // 退出程序
  22. }
  23. // 初始化sockaddr_in结构体,用于指定服务器地址和端口
  24. struct sockaddr_in ser;
  25. bzero(&ser, sizeof(ser)); // 将结构体内存清零
  26. ser.sin_family = AF_INET; // 使用IPv4地址
  27. // 将端口号从主机字节序转换为网络字节序
  28. ser.sin_port = htons(50000);
  29. // 将点分十进制的IP地址字符串转换为网络字节序的整数
  30. ser.sin_addr.s_addr = inet_addr("192.168.203.128");
  31. // 无限循环,发送数据并尝试接收响应
  32. while(1)
  33. {
  34. char buf[512] = "hello,this is udp test"; // 准备发送的数据
  35. // 发送数据到指定的服务器地址和端口
  36. sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
  37. // 清空缓冲区,准备接收数据
  38. bzero(buf, sizeof(buf));
  39. // 尝试接收数据,但源地址和端口被设置为NULL,这通常是不正确的
  40. // 在实际应用中,应该提供一个sockaddr_in结构体来接收源地址和端口信息
  41. recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
  42. // 打印接收到的数据(但在这个例子中,由于recvfrom的源地址和端口被设置为NULL,它可能不会按预期工作)
  43. printf("buf is %sn", buf);
  44. // 等待1秒后再发送下一个数据包
  45. sleep(1);
  46. }
  47. // 注意:由于程序进入了一个无限循环,下面的close和return语句实际上永远不会被执行
  48. close(sockfd); // 关闭套接字
  49. return 0; // 程序正常结束
  50. }