2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
OSI-malli ===》Avoimen järjestelmän yhteenliittämismalli ==》jaetaan 7 kerrokseen:
Ihanteellinen malli ==》Ei vielä toteutunut
tftp
b /etc/passwd
a /etc/123
Sovelluskerros
Esityskerroksen salaus ja salauksen purku gzip
Istuntokerroksen verkkoyhteyden katkeaminen, yhteyden tila, pidä-sulje säilytä-elossa
Kuljetuskerroksen tcp udp -protokollatiedosto video, ääni
Verkkokerroksen ip NAT
Linkkikerroksen kytkimen tietojen muotoilun kehystarkistus
Fyysinen kerros 100 Mb/8 Gbit 100 Mt koaksiaalikaapeli 10 Gb 2.4G 5G
Alhaalta ylös, pohja on alkeellisin
TCP/IP-malli ==》Internet-malli ==》jaettu 4 kerrokseen:
Käytännön malli ===》Teollinen standardi
tcp/ip-protokollapino
Sovelluskerros ====》Sovellus
Siirtokerros ====》Portin numero tcp udp (mitä lähetystapaa käytetään,tcp luotettava,UDP:llä on korkea reaaliaikainen suorituskyky)
Verkkokerros ====》IP-osoite (Kuinka löytää toinen osapuoli ja isäntä)
Liitäntäkerros ====》Verkkokortin ajuri 1 Gt
pcap ,,,
www.taobao.com ---> 192.168.0.19
www.voa.com vpn
DNS-verkkotunnuksen nimen resoluutio (perustuu yleensä maakuntaan)
DHCP (Dynamic Host Configuration Protocol)
Sovelluskerros:HTTP (verkkosivu) TFTP (triviaali lyhyen kantaman tiedostonsiirto)FTP (Internet pitkän matkan siirto)
SNMP (Hallinnoi ja valvo verkkolaitteita, järjestelmiä ja sovelluksia)DNS...
Siirtokerros: TCP UDP 56k kat
Verkkokerros: IP ICMP (ping) RIP OSPF IGMP...
Liitäntäkerros: ARP (Address Resolution Protocol) RARP... ip--->mac
arp,,,,
192.160.0.112
Verkon perusteet ===》ABCDE-luokka
010 3333344444
IP-osoite == verkkobitit + isäntäbitit
IP-osoitteen luokitus: pisteviiva desimaali ipv4 712934
Luokka A: Erittäin laaja verkko
8 8 8 8
1.0.0.0 - 126.255.255.255 126.1.1.1
Verkon tunnus 126.1.1.2
255.0.0.0 (aliverkon peite)
yksityinen:
10.0.0.0 - 10.255.255.255
127.0.0.1
Luokka B: Suuret ja keskisuuret verkot
128.0.0.0 - 191.255.255.255
128.2.1.2 128.2.7.2
255.255.0.0
yksityinen:
172.16.0.0 - 172.31.255.255
Luokka C: Pienet ja keskisuuret verkot
192.0.0.0 - 223.255.255.255
255.255.255.0
yksityinen:
192.168.0.0 - 192.168.255.255
Staattinen reititys
192.168.0.0
192.168.0.1 yhdyskäytävä
192.168.0.255 (Lähetys, kaikki lähiverkon käyttäjät voivat vastaanottaa sen)
Luokka D: Multicast jalähettää
224.0.0.0 - 239.255.255.255 (Ryhmäkeskustelu, ei kaikille avoin, ei rajoitu lähiverkkoon)
192.168.0.255 == 255.255.255.255 (vain LAN, yksi henkilö lähettää, kaikki vastaanottavat)
235.1.2.3
192.168.1.0
192.168.0.1 yhdyskäytävä
192.168.1.255 Lähetys
Luokka E: Kokeellinen
240.0.0.0 - 255.255.255.255
Luokan C verkko:
IP-osoitteen kolme ensimmäistä ryhmää ovat verkko-osoite ja neljäs ryhmä isäntäosoite.
Binäärin korkeimman bitin on oltava: alkaen 110xxxxx
Desimaalien esitysalue: 192.0.0.0 -223.255.255.255
Oletusverkon peite: 255.255.255.0
Verkkojen määrä: 2^24, noin 2,09 miljoonaa
Isäntien määrä: 2^8 254 + 2 ===》1 on yhdyskäytävä 1 lähetetään
Yksityinen osoite: 192.168.xx LAN-osoite.
sudo vim/etc/network/interfaces "Määritä verkko"
sudo /etc/init.d/networking restart
sudo uudelleenkäynnistys
192.168.0.0
192.168.0.1 reitti
192.168.0.255 boardcast
801.ng
Yhden koneen Internet-yhteyden määritykset:
1. Käytä verkkoliitäntää ja kytke verkkokaapeli.
2. Sinulla on IP-osoite
3. Määritä verkkoasetukset
ip (muokkaa väliaikaista IP-osoitetta): ifconfig ethX XXXX/24 ylös ifconfig ens33 192.168.0.13/24 (aliverkon peite) ylös 255.255.255.0
Yhdyskäytävä: reitti lisää oletusarvoinen gw xxxx
DNS: vi /etc/resolv.conf ==>nimipalvelin 8.8.8.8
Testi: ping www.baidu.com
nettostat -anp (voi tarkastella tietokoneen verkon tilaa)
1. pistorasia (Tiedoston kuvaus - liittyvä verkkolaite) ==》BSD-liitäntä ==》Joukko liitäntätoimintoja verkkoviestintään. pistorasia api sovelluksen käyttöliittymän käyttöliittymä
2. ip+portti osoite+portti===》Osoite on tottunutTunnista isäntä
Portti käytettyTunnista sovellukset
Portti on jaettu TCP-porttiin / UDP-porttiin, alue on: 1-65535
On sovittu, että järjestelmä käyttää portteja 1000 sisällä.
http 80 www.baidu.com
3306
Telnet 21
ssh 22
Big endian -tallennustila (vähän bittiä suuressa muistissa - verkkolaitteet)
Little endian 0x12345678 (vähän bittiä vähän muistissa – isäntä)
12 00
00 12
192.168.0.12 (big-endian) "merkittävin bitti tallennetaan ensin"
12.0.168.192 (pieni endian)
1. Ominaisuudet: Ei linkkiä, epäluotettava, iso data
2. Kehys: C/S-tila
palvelin: socket() ===>bind()===>recvfrom()===>close()
asiakas: socket() ===>bind()===>lähetä() ===>sulje()
Huomautus: Socket()-parametreja on säädettävä.
socket(PF_INET,SOCK_DGRAM,0);
bind() client(c) on valinnainen,Palvelinpuolet vaaditaan。
int socket (int domain, int tyyppi, int protokolla);
Toiminto: Ohjelma ehdottaa ytimelleLuo muistiin perustuva pistorasian kuvaaja
parametri:verkkotunnuksen osoiteperhe, PF_INET == AF_INET ==>Internet-ohjelma
PF_UNIX == AF_UNIX ==>erillinen ohjelma
tyyppi pistorasian tyyppi:
SOCK_STREAM streaming socket ===》TCP
SOCK_DGRAM User Datagram Socket ===>UDP
SOCK_RAW raw socket ===》IP
protokollaprotokolla ==》0 tarkoittaa automaattisesti mukautumista sovelluskerroksen protokollaan.
Palautusarvo: Palautus onnistuiPyydetyn pistorasian tunnus
Epäonnistuminen -1;
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
Toiminto: Jos toiminto on käytössäPalvelu-pääteKutsuttu tarkoittaa parametriin 1 liittyvän tiedostokuvaustiedoston liittämistä parametrilla 2 määritettyyn liitäntäosoitteeseenHyväksy tiedot tästä käyttöliittymästä。
Jos toiminto on käytössäAsiakaslauluJos käytetään, se tarkoittaa, että tiedot tulee ottaa pois kuvauksesta, jossa parametri 1 sijaitsee, ja liitäntälaitteesta, jossa parametri 2 sijaitsee. Lähetä ulos。
Huomautus: Jos kyseessä on asiakas, tämä toiminto voidaan jättää pois ja tiedot lähetetään oletusrajapinnan kautta.
parametri:sockfd-tiedostokuvaaja ja socket-tunnus, jotka on luotu aiemmin socket-toiminnolla
my_addr on fyysisen käyttöliittymän rakenneosoitin.Edustaa tietoja käyttöliittymästä
struct sockaddr yleinen osoiterakenne
{
u_short sa_family;
char sa_data[14];
};
Muunnettu verkko-osoiterakenne on seuraava:
struct _sockaddr_in ///Verkon osoiterakenne
{
u_short sin_family osoiteperhe
u_short sin_port; ///Osoiteportti
struct in_addr sin_addr ///osoite IP
char sin_zero[8];
};
struct in_addr
{
in_addr_t s_addr;
}
socklen_t addrlen: parametrin 2 pituus.
Paluuarvo: menestys 0
Epäonnistuminen -1;
ssize_t sendto(int sockfd, const void *buf, size_t len,int liput,
const struct sockaddr *dest_addr, socklen_t addrlen);
Toiminto: Käytetään viestien lähettämiseen toiselle osapuolelle UDP-protokollassalähettää tietoja。
parametri:sockfd local socket id
buff paikallista tallennustilaa, yleensä lähetettävää dataa
lähetettävän tiedon pituus
liput Kuinka lähettää tietoja,0 tarkoittaa lähetyksen estämistä
dest_addr: pakollinen, osoittaa kohdeisäntätietorakenteen, johon lähetetään
addrlen: kohdeosoitteen pituus
Palautusarvo: Onnistui Tiedon pituus lähetetty
Epäonnistuminen -1;
ssize_t recvfrom(int sockfd, tyhjä *buf, size_t len, int liput,
struct sockaddr *src_addr, socklen_t *addrlen);
Toiminto: käytetään UDP-protokollassaSaadaToisen osapuolen lähettämät tiedot.
parametri:sockfd local socket id
buff Muistialue, jolle tiedot tallennetaan, yleensä taulukko tai dynaaminen muisti
len on hankittavien tietojen pituus, yleensä buffin koko.
lippujen hankintamenetelmä,0 esto
src_addr on valinnainen ja edustaa toisen osapuolen osoitetietorakennettaTYHJÄ,ilmaistaÄlä välitä toisen osapuolen osoitteesta
addrlen Toisen osapuolen osoitetietorakenteen koko, josToisen osapuolen osoiteJooNULL siisTämä arvo on myös NULL
Palautusarvo: onnistuneesti vastaanotettu tiedon pituus
Epäonnistuminen -1;
kiinni() ===>Sulje määritetty socket id;
1. Datalla ja tiedolla on rajansa
2. Lähetys- ja vastaanottamiskertojen tulee vastata toisiaan
3.recvfrom estää
4.sento ei estä (recvfrom ei vastaanota, ei vaikuta lähetysten lähettämiseen)
c etsii s:tä
server.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <time.h>
-
- typedef struct sockaddr *SA;
-
- int main(int argc, char *argv[])
- {
- int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字
- if(-1 == sockfd) // 检查socket调用是否失败
- {
- perror("socket"); // 打印错误信息
- exit(1); // 退出程序
- }
-
- // 定义服务器地址和客户端地址结构体(尽管客户端地址通常在recvfrom中填充)
- struct sockaddr_in ser, cli;
- bzero(&ser, sizeof(ser)); // 初始化服务器地址结构体
- bzero(&cli, sizeof(cli)); // 初始化客户端地址结构体(但这里实际上不需要提前初始化)
-
- // 设置服务器地址结构体
- ser.sin_family = AF_INET;
- ser.sin_port = htons(50000); // 端口号转换为网络字节序
- ser.sin_addr.s_addr = inet_addr("192.168.203.128"); // 服务器IP地址
-
- // 将套接字绑定到服务器地址和端口
- int ret = bind(sockfd, (SA)&ser, sizeof(ser));
- if(-1 == ret)
- {
- perror("bind"); // 绑定失败时打印错误信息
- exit(1); // 退出程序
- }
-
- socklen_t len = sizeof(cli); // 用于recvfrom的客户端地址长度
-
- // 无限循环接收数据并发送响应
- while(1)
- {
- char buf[512] = {0}; // 准备接收数据的缓冲区
- // 接收数据,注意这里&len是必需的,因为recvfrom会修改它以反映实际接收到的客户端地址长度
- recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);
-
- time_t tm;
- time(&tm); // 获取当前时间
-
- // 这里有一个问题:buf被用于接收数据,然后又被用于存储新的字符串(包括原始数据和时间戳)
- // 这会导致原始数据被覆盖。应该使用另一个缓冲区来存储最终的发送数据
- sprintf(buf, "%s %s", buf, ctime(&tm)); // 将时间戳附加到接收到的数据上
-
- // 发送数据回客户端,但注意len在这里已经被recvfrom修改,表示客户端地址的长度
- // 对于sendto,我们应该使用sizeof(cli)或重新初始化len
- sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, len); // 这里使用len可能不是最佳实践
- }
-
- // 注意:由于程序进入了一个无限循环,下面的close和return语句实际上永远不会被执行
- close(sockfd); // 正常情况下应该关闭套接字
- return 0; // 程序正常结束
- }
asiakas.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/ip.h>
- #include <arpa/inet.h>
- #include <time.h>
-
- // 定义一个类型别名SA,指向sockaddr结构体
- typedef struct sockaddr *SA;
- // 注意:它尝试定义一个函数指针类型而不是简单的结构体指针。
-
-
- int main(int argc, char *argv[])
- {
- // 创建一个UDP套接字
- int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if(-1 == sockfd)
- {
- perror("socket"); // 如果创建套接字失败,打印错误信息
- exit(1); // 退出程序
- }
-
- // 初始化sockaddr_in结构体,用于指定服务器地址和端口
- struct sockaddr_in ser;
- bzero(&ser, sizeof(ser)); // 将结构体内存清零
- ser.sin_family = AF_INET; // 使用IPv4地址
- // 将端口号从主机字节序转换为网络字节序
- ser.sin_port = htons(50000);
- // 将点分十进制的IP地址字符串转换为网络字节序的整数
- ser.sin_addr.s_addr = inet_addr("192.168.203.128");
-
- // 无限循环,发送数据并尝试接收响应
- while(1)
- {
- char buf[512] = "hello,this is udp test"; // 准备发送的数据
- // 发送数据到指定的服务器地址和端口
- sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
-
- // 清空缓冲区,准备接收数据
- bzero(buf, sizeof(buf));
- // 尝试接收数据,但源地址和端口被设置为NULL,这通常是不正确的
- // 在实际应用中,应该提供一个sockaddr_in结构体来接收源地址和端口信息
- recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
-
- // 打印接收到的数据(但在这个例子中,由于recvfrom的源地址和端口被设置为NULL,它可能不会按预期工作)
- printf("buf is %sn", buf);
-
- // 等待1秒后再发送下一个数据包
- sleep(1);
- }
-
- // 注意:由于程序进入了一个无限循环,下面的close和return语句实际上永远不会被执行
- close(sockfd); // 关闭套接字
- return 0; // 程序正常结束
- }