网络编程(一)

来源:互联网 发布:人工智能招聘信息 编辑:程序博客网 时间:2024/06/03 12:48

  大家都知道在网络上有两种角色,一个是服务器,另外一个是客户端,那么什么是服务器,什么又是客户端呢?客户端和服务器如何进行通信的呢?接下来我就给大家简单讲一讲网络上通信的过程。

  服务器(server):提供数据的为服务器

  客户端(client):获取数据的为客户端

  在之前的学习中,我们知道了网络的分层,有两种模型分别是OSI模型和TCP/IP模型,我们一般讲的是后者。TCP/IP模型共有四层,它们分别是(从上到下):应用层、传输层、网络层、数据链路层。传输层协议主要有两种:TCP和UDP。网络层主要协议是:IP。接下来说的TCP协议就是传输层的一种重要协议。

  TCP协议是传输层协议的一种,它的特点是面向连接的、可靠地、流式服务。

  TCP的编程流程:

    服务器:socket、bind、listen、accept、 recv/send 、close

    客户端: sockfd 、 /*bind*/、connect、recv/send、close

  TCP报头:

  

  端口号:告诉主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。

  序号:一次TCP通信过程中某一传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(初始序列值)。那么在该传输方向上,后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。

  确认号:用作对另一方发送来的TCP报文段的响应,其值是收到的TCP报文段的序号值加1。

  头部长度:4位最大能表示到15,所以TCP头部最长是60字节。

  6位标志:

     URG-紧急指针是否有效。

     ACK-确认号是否有效,携带ACK标志的报文段称为确认报文段。

     PSH-表示接收端应用程序应该立即从TCP接受缓冲区中读走数据,为接收后续数据腾出空间。

     FIN-表示通知对方要关闭连接了。

     SYN-表示请求建立一个链接。

     RST-表示要求对方重新建立链接。 

  窗口大小:运用流量控制的手段,告诉对方本端的TCP接收缓冲区还能容纳多少 字节的数据,这样对方就能控制发送数据的速度。

  校验和:发送端填充,接收端运用CRC算法对其进行检验TCP报文段在传输过程中是否有损坏。注意,这个检验包括头部和数据部分。

  紧急指针:正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。

  1、TCP的面向连接

     (1)三次握手建立连接

  

    说明:客户端向服务器发送一个SYN链接请求,服务器收到请求后,连着同意SYN和一个确认ACK一起发送给客户端,客户端收到后再给服务器发送一个ACK的确认报文,表明自己收到了服务器发送的报文。

    注意:三次握手建立连接的过程最少限度是三次。如果是两次(缺少第三次),服务器没有收到客户端的ACK,就会重发之前发的报文,重发次数达到一定之后,服务器就会放弃这次链接,那么本次建立链接就会失败。

   (2) 四次挥手断开链接

 

   说明:当客户端需要断开链接时,客户端向服务器发送一个FIN,请求断开链接,服务器收到请求,发送ACK同意客户端断开链接。此时,服务器可能还有数据需要处理,所以会有处理数据的时间,当数据处理完之后,服务器向客户端也发送一个FIN请求断开链接,然后客户端发送ACK同意断开链接。所以此时,断开链接需要四次挥手。有时候,三次挥手也是可以的,如下图。

    

    当服务器收到客户端发来的FIN断开链接请求时,它自己没有数据需要处理,所以就会将ACK连着FIN一起发送给客户端,客户端收到以后,就直接发送ACK,然后双方断开链接。

     (3)三次挥手和四次握手状态图

 

    如上图所示,是TCP连接的建立和断开过程中客户端和服务器的状态变化。其中比较重要的一个状态是TIME_WAIT。

    TIME_WAIT状态:出现在主动发起断开链接请求的一端。

    作用:1、保证可靠的终止TCP链接。如果在四次挥手过程中,服务器向客户端发送FIN后,客户端收到之后向服务器发送ACK后直接关闭,那么一但服务器没有收到ACK的话,就一直等待最后一个ACK,而此时客户端已经关闭了,那么就造成此次链接没有成功的关闭。

               2、保证迟来的数据报能够识别并丢弃。在数据还在传输的同时,某一方发送的断开链接请求可能会比数据早到达,那么此时就需要接受的这一方对数据进行分析,如果不需要就丢弃。TIME_WAIT状态有效的解决了这一问题。

  2、可靠性

    由上面TCP报头结构可知TCP的可靠性:

    (1)32位序号-保证数据有序

    (2)32位确认号和超时重传-保证报文段不会丢失

             超时重传:TCP服务必须能够重传超时间未收到确认的TCP报文段。所以在每个TCP报文段都有一个重传定时器。该定时器在TCP报文段第一次被发送时启动。如果超时时间内未接收到对方的应答,TCP模块将重置定时器,再次重发数据。如果在超时时间内接收到了对方的应答,那么定时器将会被丢弃。

    (3)16位窗口大小-保证空间大小和数据大小相符合,报文段能全部被接受

    (4)16位检验和-保证数据准确,不会失真

  3、流式服务(数据流服务)

 

  如上图所示,是TCP流式服务的示意图。从图中可以看出,有TCP发送缓冲区和TCP接收缓冲区。发送端发送多个数据到发送缓冲区,接收端从接收缓冲区中取数据时,可能一次性把缓冲区中所有的数据全部获取,那么就是n->m的关系,提高了效率。

  综上所述,就是关于TCP的相关知识。

  

   

   

 


原创粉丝点击