zoukankan      html  css  js  c++  java
  • 基于TCP/UDP的socket编程

    基于TCP(面向连接)的socket编程
    服务器端顺序:
    1. 创建套接字(socket)
    2. 将套接字绑定到一个本地地址和端口上(bind)
    3. 将套接字设为监听模式,准备接收客户请求(listen)
    4. 等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
    5. 用返回的套接字和客户端进行通信(send/recv)
    6. 返回,等待另一个客户请求
    7. 关闭套接字(closesocket)
    客户端程序:
    1. 创建套接字(socket)
    2. 向服务器发送连接请求(connect)
    3. 和服务器端进行通信(send/recv)
    4. 关闭套接字(closesocket)

    TCP建立连接的三次握手发生在socket的那几个函数中呢?请看下图:

    图1、socket中发送的TCP三次握手

    从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

    总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

    基于UDP(面向无连接)的socket编程
    服务器端(接收端)程序:
    1. 创建套接字(socket)
    2. 将套接字绑定到一个本地地址和端口上(bind)
    3. 等待接收数据(recvfrom)
    4. 关闭套接字(closesocket)
    客户端(发送端)程序
    1. 创建套接字(socket)
    2. 向服务器发送数据(sendto)
    3. 关闭套接字(closesocket)

    如何用UDP协议实现TCP协议?

    一点思路:使用UDP协议在数据包里添加TCP的头部使其能够实现TCP的基本功能,包括重传,滑动窗口,慢开始和拥塞控制,滑动窗口的大小可以通过命令行指定。即应用层再封装一个TCP报头,然后解析的时候在协议栈里面把偏移多偏几个字节。

    参考资料:

    [1] Linux Socket编程(不限Linux).
    http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

    [2] 如何基于udp实现tcp协议栈?
    http://bbs.csdn.net/topics/280046868

  • 相关阅读:
    Mapreduce 进阶
    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io .nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V
    hive INSERT OVERWRITE table could not be cleaned up.
    flume 多chanel配置
    java jar包与配置文件的写法
    CDH 修改配置注意事项
    Scala 闭包
    Error: Java heap space
    Spark Streaming 执行流程
    python统计字符串中每个单词出现的个数【一行】
  • 原文地址:https://www.cnblogs.com/li-chong/p/3250107.html
Copyright © 2011-2022 走看看