Linux下的网络通讯

UDP:用户数据报协议  传输层
特点:
    1.无连接
    2.不安全、不可靠
    3.面向报文
    4.占用资源开销小
    
TCP : 传输控制协议   传输层

1. TCP特点:
    1.面向连接
    2.安全、可靠
    3.面向字节流
    4.占用资源开销大

    三次握手:
        指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接。
    四次挥手:
        断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开。


2. 编程模型

   client: socket--->connect--->send/write--->close
   server:    socket--->bind--->listen--->accept---> recv/read--->close
    
3. 函数接口:
    1.socket
      socket(AF_INET, SOCK_STREAM, 0);
    
    2.connect
      int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
      功能:
        发送三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        addr:存放目的地址空间首地址
        addrlen:目的地址长度
      返回值:
        成功返回0 
        失败返回-1 
        
    3.send
      ssize_t send(int sockfd, const void *buf, size_t len, int flags);
      功能:
        发送数据
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:数据长度
        flag:属性默认为0 
      返回值:
        成功返回发送字节数
        失败返回-1 
        
    4.recv
      ssize_t recv(int sockfd, void *buf, size_t len, int flags);
      功能:
        接收数据 
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址 
        len:最多接收数据长度 
        flags:接收属性默认为0 
      返回值:
        成功返回实际接收字节数
        失败返回-1 
        连接断开返回0 

    5.bind
      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

    6.listen
      int listen(int sockfd, int backlog);
      功能:
        监听三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        backlog:最多允许等待尚未处理的三次握手链接个数
      返回值:
        成功返回0 
        失败返回-1 

    10.accept
       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
       功能:
          处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
       参数:
          sockfd:套接字文件描述符
          addr:存放发送端IP地址空间首地址 
          addrlen:想要接收的IP地址的长度 
       返回值:
          成功返回新文件描述符
          失败返回-1 


4. TCP粘包问题
    
    TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

    粘包问题出现的原因: 

     1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

     2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

    避免粘包问题的方法:

     1. 对于定长的包,保证每次都按固定大小读取即可;//  结构体

     2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。


     
5. TCP报文头

    标志位:
    
    1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
    2. ACK: 确认应答标志
    3. PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
    4. RST: 重置连接标志
    5. SYN: 表示请求建立一个连接
    6. FIN: finish标志, 表示释放连接
    

    滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,
                这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.
                

6. TCP的机制:
    TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

    可靠性:

        (1)三次握手和四次挥手机制
        
         (2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

        (3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

        (4)流量控制:按照ACK中“窗口大小”字段控制发送端的发送速度


    提高性能:

        (1)滑动窗口:可以按照“窗口大小”, 一次发送多条后, 再等待应答。

        (2)延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大

        (3)捎带应答:搭载应用层的响应报文发送ACK。

=======================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值