• linux网络编程一学习笔记


    linux网络编程:重点TCP—UDP协议 

    1.OSI模型与TCP/IP协议体系结构

    2.TCP/IP协议---传输控制协议TCP(transport control protocol)和互联网协议IP

    3.TCP和UDP协议

    体系结构:(理解)网络的层次结构和每一层所使用协议的集合。。。

    1.将网络的功能划分为不同的模块,以分层的形式有机组合在一起。

    2.两类重要的体系结构:OSI和TCP/IP   两者的区别:??前者理想化后者事实上得工业标准采用的  即分层不同。。。

    OSI开放系统互联模型:

    1.OSI的七层结构

    最下层:物理层----比特流,无格式的01二进制的串。。。。。

            链路层---数据组成可发送、接收的帧    MAC地址:6字节,前3个字节固定为公司的标识符。

            网络层---IP地址(源主机,和目标主机的IP地址)主要的功能:为数据包选择路由。

            传输层---提供可靠的数据传输。。(端口号)内核对外提供的最外一层。。

            会话层---实际中一般没有,了解。。。

            表示层---数据格式的定义和数据转换/加密

            应用层---应用程序,文件传送输

    2.TCP/IP协议族的体系结构:(4层)

    应用层---Telnet 和 FTP等

    传输层---TCP和UDP

    网络层---IP  ICMP IGMP

    网络接口和物理层

    ARP协议:根据IP地址获得MAC地址; RARP协议:根据MAC地址获得IP地址

    3.TCP和UDP协议

    共同点:都是传输协议

    不同点:TCP:有链接,可靠。。而UDP:无连接,不保证可靠

    4.TCP协议特点:

    高可靠性通信:数据无误(TCP校验),数据无丢失(丢了,给用户重新发送),数据无失序(不能保证先来先发,但根据包的序号,进行排序),数据无重复到达的通信。(高可靠性------4无产品)

    5.socket

    它是一种系统关于网络编程的接口;是一种特殊的文件描述符;

    socket类型:流式套接字----运用在TCP协议;数据报套接字----运用于UDP协议; 原始套接字-----运用于较低层次协议如IP,ICMP。。。

    6.IP地址:是Internet中主机的标识。

    表示形式:常用点分形式,如:192.168.1.66,最后都会转换为一个32位的无符号整数。

    IP地址的转换:inet_aton()将所有字符串转换为32位的网络字节序二进制值。

                  inet_addr()功能同上,返回转换后的地址。

                  inet_ntoa()将32位的网络字节序二进制地址转换成点分十进制的字符串。

    7.端口号:

    区别一台主机接收到的数据包应该转交给那个进程来进行处理,使用端口来区别。

    TCP端口号和UDP端口号独立。

    网络通信三元组合:IP,端口,协议。。。。

    8. 字节序:内存存储多字节整数序列有两种方法,称为主机字节序。

    小端:低序字节存储在低地址。

    大端:高序节存储在低地址。

    网络中传输的数据必须按网络字节序,即大端字节序。

    在大部分PC机上,当应用进程将证书传入socket前需要转换成网络字节序。

             字节序转换函数:

                       主机字节序到网络字节序:

                                u_long htonl (u_long hostlong);

                                u_short htons (u_short short);

                       网络字节序到主机字节序:

                                ulong ntohl (u_long hostlong);

                                u_short ntohs (u_short short);

    9.网络编程相关API:

             int socket(int domain, int type, int protocol);

                       domain:是地址族。

                                PF_INET   //网络通信。

                                PF_UNIX  //本地通信。

                       type:套接字类型

                                SOCK_STREAM   //流式套接字

                                SOCK_DGRAM   //数据包套接字

                                SOCK_RAW     //原始套接字

                       protocol:协议编号,除了使用原始套接字,均用0。

             int bind(int sockfd, struct sockaddr *my_addr, int addrlen);  返回值 0 和 -1

             sockfd:socket调用返回的文件描述符。

        addrlen:sockaddr地址结构的长度==sizeof(myaddr)

    通用地址结构:

                      struct sockaddr

                     {

                               u_short sa_family;  //地址族,2个字节

                               char sa_data[14];   //14字节协议地址

                    };

    网络地址结构:

                      struct sockaddr_in

                     {                                    生成实例后不要忘记bzero(&变量, sizeof(变量));

                                u_short sin_family; //地址族 2个字节                   PF_INET

                                u_short sin_port;     //端口号 2个字节                   htons(6000)

                                struct in_addr sin_addr; //IPV4地址 4个字节     inet_addr(…)

                                char sin_zero[8];    //作为填充,8个字节            …

                    };

                      本地通信:

                       struck sockaddr_un

                     {

                                …….

                     }

             int listen(int sockfd, int backlog); //TCP服务器端使用的函数。

                       只有调用了listen以后将sockfd改成被动模式,才能实现监听,等待请求。

                       backlog:等待队列的长度,能允许多少客户排队。

             int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

                        返回值:已建立好链接的套接字或-1。                              

                       sockfd:监听套接字。

                       addr:对方地址。不关心别人地址的话填入NULL。

                       addrlen:对方地址的长度。

             int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);    //TCP客户端使用的函数

                       返回值:0或-1

                       sockfd:socket返回的文件描述符。

                       serv_addr:服务器端的地址信息。

                       addrlen:serv_addr的长度。

             ssize_t send(int socket, const void *buffer, size_t length, int flags);

                       返回值:成功返回实际发送的字节数,失败返回-1,并设置errno。

                       buffer:发送缓冲区首地址。

                       length:发送的字节数。

                       flags:发送方式,通常为0。

             ssize_t recv(int socket, con void *buffer, size_t length, int flags);

                       返回值:成功返回实际接收的字节数。失败返回-1,并设置errno。

                       buffer:发送缓冲区首地址。

                       length:发送的字节数。

                       flags:接受方式,通常为0。

    shutdown:

    使用时强转为通用类型,因为结构体生成的实例大小一样。

    10.服务器流程

    i.创建套接字

    ii.绑定IP与端口号

    iii.启动监听状态 接收连接(第二次握手)

    iiii.发送请求服务(第三次握手)

    11.客户端流程

    i.创建套接字

    ii.绑定(可选自己绑定或是服务器自动分配)

    iii.连接(第一次握手,连到服务器的监听)

    iiii.创建新的套接字等待请求(分派服务)

     

  • 相关阅读:
    字符串中去除连续相同的字符保留一个
    截取字符串中最后一个中文词语(MS SQL)
    WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery'. Please add a ScriptResourceMapping named jquery(case-sensitive).
    Unexpected error from external database driver (1)
    RDLC报表显示存储于数据库的图片
    从angularjs传递参数至Web API
    angularjs呼叫Web API
    创建Web API并使用
    打印网页中某一段内容
    在angularjs实现一个时钟
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2318474.html
Copyright © 2020-2023  润新知