zoukankan      html  css  js  c++  java
  • UNIX网络编程总结二

    绝大多数客户-服务程序使用TCP和UDP,这两个协议转而使用IP。UDP是一种简单的,不可靠的数据报协议,TCP是一种精致的可靠的字节流协议。

    在TCP/IP协议族中:

    mrouted:IGMP→IPv4

    ping:ICMP→IPv4/IPv6

    Traceout:ICMP→IPv4/IPv6,IPv4/IPv6

    Application:TCP/UDP→IPv4/IPv6

    UDP:

      UDP是一个简单的传输层协议,应用进程写数据报到UDP套接口,由它封装成IP数据报,然后发送到目的地,但是UDP不保证数据报最终可达目的地。我们也称UDP提供无连接的服务,因为UDP客户与服务不必存在长期的关系。

    TCP:

    1、TCP提供客户与服务器的链接。

    2、TCP提供可靠性。

    3、TCP通过给每一个所发送的字节关联一个序号进行排序。

    4、TCP提供流量控制。

    5、TCP是全双工的。

    TCP连接三路握手:

    1、服务端通过socket、bind、listen完成被动打开。

    2、客户端通过connect执行主动打开,并发送一个SYN分节,他告诉服务器他将在链接中发送的数据的初始序列号,一般SYN分节不携带数据,它只含有一个IP头部,一个TCP头部和可能存在的TCP选项(一次握手)。

    3、服务器确认客户的SYN分节,同时发送一个SYN分节,他含有服务器将在链接中发送的数据的初始序列号(二次握手)。

    4、客户端需确认服务端的SYN(三次握手)。

    TCP的SYN选项:

    MSS选项:通知对方它的最大分节大小。

    窗口规模选项:TCP通知双方的最大窗口大小。

    时间戳选项:防止失而复得的分组造成的数据损坏,高速连接是使用。

    TCP终止:

    1、调用close执行主动关闭(发送FIN分节)。

    2、接收FIN的一端执行被动关闭,也作为文件结束符传给应用进程。

    3、接收文件接收符的应用进程执行close,它的TCP发送一个FIN。

    4、原发送方收到后执行确认ACK。

    TCP状态转换:

    Client发送SYN分节调用主动打开,状态转为SYN_SENT;

    Server接收到SYN分节,向client发送SYN分节和ACK信息,变为SYN_RCVD;

    Client接收到SYN分节和ACK信息,向server发送ACK,client变为ESTABLISHED;

    server接收到ACK状态转为ESTABLISHED;

    --------------------------------------------------------------------------------------------------------------------

    Client发送FIN发起关闭,状态转换为FIN_WAIT_1;

    Client接收到ACK,状态转换为FIN_WAIT_2;

    Client接收到,发出ACK,状态转换为TIME_WAIT;

    TIME_WAIT持续2MSL(最长分节生命期),状态转为关闭。

    --------------------------------------------------------------------------------------------------------------------

    Client发送FIN发起关闭,状态转换为FIN_WAIT_1;

    Client接收到server的FIN并回ACK,状态转换为CLOSING;

    Client接收到server的ACK,状态转换为TIME_WAIT;

    TIME_WAIT持续2MSL,状态转为关闭。

    --------------------------------------------------------------------------------------------------------------------

    Client发送FIN发起关闭,状态转换为FIN_WAIT_1;

    Client接收到server的FIN;ACK并回ACK,状态转换为TIME_WAIT;

    TIME_WAIT持续2MSL,状态转为关闭。

    -----------------------------------------------------------------------------------------------------------

    ESTABLISHED的server接收到FIN,并返回ACK,状态转换为CLOSE_WAIT;

    Server发送FIN,状态转换为LAST_ACK;

    Server接收到ACK,状态转为关闭。

    TIME_WAIT存在的理由:

    1、实现TCP全双工的可靠性。

    若最终的ACK丢失,服务端可能重发最后的FIN,客户端可能不得不重发最终的ACK。

    2、允许老的重复分节在网络中消逝。

    在关闭连接后,之后又重新用相同的IP地址和端口创建连接,2MSL可以保证两个方向发送的分组被完全丢弃,保证老的分组已经在网络中消逝。

    缓存区:

    IPv4数据报最大为65535字节,包括IPv4头部(20字节)。

    IPv6数据报最大为65575,IPv6头部占40字节,有效负载长度16位。

    最大传输单元(MTU),以太网的MTU为1500,IPv4的最小MTU为68,IPv6为576字节,路径MTU在不同方向可以不同。若一个ip数据报超过最大MTU,IPv4和IPv6都会执行分片,IPv4在主机和路由器转发的数据报都会执行分片,IPv6只在主机对数据报进行分片。但若IPv4的DF位被设置,则不允许分片,但会抛错。IPv4支持的最小数据报为576字节,IPv6为1500字节。

    调用write时,内核从应用进程的缓存器拷贝数据到套接口的缓存区,拷贝完成write返回,所以write完成只代表拷贝完成,不代表数据传输成功。

    UDP套接口的发送缓存区仅仅是发送到该套接口的UDP数据报的大小上限。

  • 相关阅读:
    OpenCR 固件修复
    E-PUCK2机器人-固件更新
    E-puck2机器人系列教程-2.软件的安装与使用
    E-PUCK2机器人-硬件
    E-puck2机器人系列教程-固件修复升级
    GridView
    TimePicker 和TimePickerDiag
    android中实现简单的播放
    ListView的使用
    android的activity的跳转
  • 原文地址:https://www.cnblogs.com/small-office/p/9337257.html
Copyright © 2011-2022 走看看