基于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的那几个函数中呢?请看下图:
从图中可以看出,当客户端调用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