网络编程流程汇总

一、TCP网络编程流程

TCP(即传输控制协议)概念:

是一种面向连接的、可靠的、基于字节流的传输层通信协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

适用情况:

适合于对传输质量要求较高,以及传输大量数据的通信。在需要可靠数据传输的场合,通常使用TCP协议,MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

 服务器流程:

创建流式套接字-----socket

填充服务器网络信息结构体

将套接字和服务器网络信息结构体绑定-----bind

将套接字置成被动监听状态-----listen

阻塞等待客户端连接-----accept

收发数据-----send/recv

关闭套接字-----close

客户端流程: 

创建流式套接字-----sock

填充服务器网络信息结构体

与服务器建立连接-----connect

收发数据-----send/recv

关闭套接字-----close

1.TCP的三次握手 

三次握手发生在建立连接的过程中,是由客户端主动发起的。

发生在服务器的 accept(listen) 函数 和 客户端的 connect 函数之间。

三次握手的目的就是为了确保通信的双方都知道对方收发数据的能力没问题

同时,三次握手也是同步序列号的过程。

第一次握手:建立连接时,客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=k+1),发送完毕,完成三次握手。

三次握手目的:

第一次握手:客户端发送网络包,服务端收到。
服务器就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
服务器就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

2.TCP四次握手

发生在连接断开的过程中,由主动关闭方发起(一般情况下,都是由客户端发起的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

四次挥手目的:

第一次握手:客户端向服务器请求断开连接,当服务器收到客户端终止连接请求的时候需要做出响应。

第二次挥手:服务器表示已经收到了客户端断开连接的请求,至此客户端到服务器的连接关闭,但服务器还存在部分数据没有发送给客户端的情况,当服务器发送完成数据会向客户端发送断开连接的请求。

第三次握手:服务器收到客户端断开连接且已经没有数据需要发送给客户端的时候向客户端请求断开连接,当客户端收到服务器终止连接请求的时候需要做出响应。

第四次握手:服务器表示已经收到了客户端断开连接的请求,至此服务器到客户端的连接关闭,客户端到服务器的连接也关闭了,四次挥手保证了双端正确的断开连接。

 二、UDP网络编程流程

UDP(User Datagram Protocol)用户数据报协议概念:

是不可靠的无连接的协议。减少了开销和发送数据之前的时延,可以进行高效率的数据传输。

适用情况:

发送小尺寸数据(如对DNS服务器进行IP地址查询时)

在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)

适合于广播/组播式通信中。

MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议

流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

 服务器流程:

创建用户数据报套接字-----socket

填充服务器网络信息结构体

将套接字和服务器的网络信息结构体绑定-----bind

收发数据 -----sendto/recvfrom

关闭套接字-----close

 客户端流程:

创建用户数据报套接字-----socket

填充服务器网络信息结构体

收发数据 -----sendto/recvfrom

关闭套接字-----close

 三、TPC与UDP的区别和注意事项

 TCP

1.客户端一般不需要绑定自己的网络信息结构体

因为操作系统会自动给客户端的ip地址和端口号赋值,也方便用户操作。

如果想要手动指定,也可以,需要调用bind()函数即可。

2.服务器端accept函数的后两个参数即使设置成NULL,服务器也可以给客户端回复消息,

原因是,服务器侧不是依赖于手动给定的IP地址和端口号来联系客户端的,而是给每个

客户端都分配一个独立的文件描述符 acceptfd,来专门用于和该客户端通信,

也就是说TCP的服务器,acceptfd和客户端是一一对应的关系。

3.TCP网络编程中可以使用 read/write send/recv sendto/recvfrom 来收发数据。

4.服务器端的accept函数本质就是一个阻塞的读函数,也就是一个就收函数,

客户端的connect函数本质就是个写函数,也就是一个发送函数,

收发的数据本质就是客户端的网络信息结构体。

5.TCP的服务器默认的是一个循环服务器,没法同时处理多个客户端的请求,

原因是tcp的服务器有两个阻塞函数 accept 和 recv,两个函数之间相互会有影响。

可以使用 多进程 多线程 IO多路复用 来解决。

UDP:

1.UDP是无连接的,但是也可以双向的收发数据

因为UDP使用的是 sendto/recvfrom 来收发数据,sendto时可以指定接收方的信息。

sendto函数相当于 send函数和 connect函数的二合一

recvfrom函数相当于 recv函数和 accept函数的二合一

2.UDP中客户端也可以使用 connect 函数先将自己的网络信息结构体发给服务器,

然后就可以使用 send 和 recv 收发数据了。

3.如果UDP服务器端的recvfrom函数的后两个参数设置成 NULL了,那么接收数据是没有问题的,

但是就没法给发送方回信了,因为sendto的后两个参数没法填写。

4.UDP服务器默认的就是一个并发服务器,因为只有一个阻塞的函数 recvfrom。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值