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

TCP/IP和网络编程

一、TCP/IP

1、TCP/IP协议

TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网路接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。

2、IP主机和IP地址

(1)主机

主机是支持TCP/IP协议的计算机或设备。
每个主机由一个32位的IP地址来标识。为方便起见,32位的IP地址号通常用点记法(点分十进制)表示,例如:134.121.64.1,其中各个字节用点号分开。主机也可以用主机名来表示,如dns1.eec.wsu.edu。

(2)IP地址

分为两部分,即NetworkID字段和HostID字段。根据划分,IP地址分为A~E类。例如,一个B类P地址被划分为一个16位NetworkID,其中前2位是10,然后是一个16位的HostID字段。发往P地址的数据包首先被发送到具有相同networkID 的路由器。路由器将通过HostID将数据包转发到网络中的特定主机。每个主机都有一个本地主机名localhost,默认P地址为127.0.0.1。本地主机的链路层是一个回送虚拟设备,它将每个数据包路由回同一个 localhost。

3、IP协议

用于在IP主机之间发送/接收数据包。IP尽最大努力运行。IP主机只向接收主机发送数据包,但它不能保证数据包会被发送到它们的目的地,也不能保证按顺序发送。

4、IP数据包格式

IP数据包由IP头、发送方地址和接收方IP地址以及数据组成。

二、套接字API

在网络编程中,TCP/IP的用户界面是通过一系列C语言库函数和系统调用来实现的,这些函数和系统调用统称为套接字API((Rago1993;Stevens等2004)。为了使用套接字 API,我们需要套接字地址结构,它用于标识服务器和客户机。netdbh和sys/socketh中有套接字地址结构的定义。

1、套接字地址

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

在套接字地址结构中

TCP/IP网络的sin family始终设置为AFINET。 
sin_port包含按网络字节顺序排列的端口号。
sin_addr是按网络字节顺序排列的主机IP地址。

2、套接字API

(1)int套接字 (int域 ,int类型,int协议)
(2)int bind(int sockfd,struct sockaddr *addr,socklen_t addrlen)
(3)UDP套接字
UDP套接字使用sendto()/recvfrom0)来发送/接收数据报。

ssizetsendto(int sockfd, const void *buf, sizet len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssizet recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklent *addrlen);

(4)TCP套接字
在创建套接字并将其绑定到服务器地址之后,TCP服务器使用listen()和accept()来接收来自客户机的连接

int listen(int sockfdint backlog);
int accept(int sockfd,struct sockaddr *addr,socklen t *addrlen);

三、实践

代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
    
#define MAXLINE 256
#define PORT 7777
void sys_err(char *msg)
{
    perror(msg);
    exit(-1);
}
int main(int argc , char **argv)
{
    int sockFd,n;
    char recvLine[MAXLINE];
    struct sockaddr_in servAddr;
    if (argc != 2) 
    {
        sys_err("usage: a.out <IPaddress>");
    }
    
    sockFd=socket(AF_INET,SOCK_STREAM,0);

    memset(&servAddr,0,sizeof(servAddr));
        
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(PORT);
    if (inet_pton(AF_INET,argv[1],&servAddr.sin_addr) <= 0) 
    {
        sys_err("inet_pton error");
    }
        
    connect(sockFd,(struct sockaddr *)&servAddr,sizeof(servAddr));
    
    
    while((n=read(sockFd,recvLine,MAXLINE)) >0 )
    {
        recvLine[n] = '\0';
        if(fputs(recvLine,stdout) == EOF)
        {
            sys_err("fputs error");
        }
    }
    if(n <0)
    {
            sys_err("read error");
    }
        return 0;
}
原文地址:https://www.cnblogs.com/daijunxi2019/p/15590183.html