最近在捣鼓树莓派,实验室要用树莓派做图像处理后回传数据到计算机,所以开始学习socket相关知识,这一篇文章主要是计算机网络通信基础。

TCP/IP、UDP

在开始之前,先听两个笑话?

TCP

> “嗨,我想听一个 TCP 的笑话。” //第一次握手

> “你好,你想听 TCP 的笑话么?” //第二次握手

> “嗯,我想听一个 TCP 的笑话。” //第三次握手

> “好的,我会给你讲一个TCP 的笑话。”

> “好的,我会听一个TCP 的笑话。”

> “你准备好听一个TCP 的笑话么?”

> “嗯,我准备好听一个TCP 的笑话”

> “OK,那我要发 TCP 笑话了。大概有 10 秒,20 个字。”

> “嗯,我准备收你那个 10 秒时长,20 个字的笑话了。”

> “抱歉,你的链接超时了。你好,你想听 TCP 的笑话么?”

UDP

> 我给你们讲个UDP的笑话吧!

> 我给你们讲个UDP的笑话吧!

> 我给你们讲个UDP的笑话吧!

> 我给你们讲个UDP的笑话吧!

学完之后,发现这两个笑话很好的表示出了两种协议的通信方式,来看看

TCP/IP,即传输控制协议/网间协议,是互联网相关各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。UDP是与TCP相对应的协议,属于TCP/IP协议族中的一种

OSI七层模型

OSI是一个理想的模型,一般的网络系统只涉及其中的几层,在七层模型中,每一层都提供一个特殊 的网络功能。

从网络角度观察:

  • 下面四层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能, 即以节点到节点之间的通信为主

  • 第四层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分

  • 上三层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。

简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能

协议关系

TCP/IP协议族包括应用层、运输层、网络层、链路层,分层后设计相对简单

数据链路层负责接收IP数据包并通过网络发送,或从网络上接受物理帧,抽出IP数据包,交给IP层

网络层负责相邻计算机之间的通信,功能包括:

  • 处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口
  • 处理剩下的数据报,首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报
  • 处理路径、流控、拥塞等问题

传输层提供应用程序间的通信,功能包括:

  • 格式化信息流
  • 提供可靠传输,TCP和UDP协议就是为了实现这个而存在

应用层为用户提供常用应用程序

TCP

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP为了保证报文传输的可靠,给每个包一个序号,同时序号保证了传送到接收端实体的包的按序接受

接收端实体对已成功收到的字节发回一个相应的确认(ACK), 如果发送端实体在合理的往返时延(RTT)内未收到确认,则对应数据将会被重传

建立连接

使用三次握手协议建立连接,就如前面的笑话开始时的交流确认,客户端和服务端总共发送3个包以确认连接的建立

  • 第一次握手:客户端SYN标志位置为1,随机产生一个值seq=J,并将该数据报发送给服务端,客户端进入SYS_SENT状态,等待服务端确认

  • 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位、SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCVD状态。

  • 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,若正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务端,服务端检查ack是否为K+1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后就可以传输数据了

断开连接

断开一个TCP连接,需要客户端和服务端总共发送4个包以确认连接的断开。在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,又称四次挥手

  • 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态

  • 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态

  • 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态

  • 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,紧接着发送一个ACK到服务端,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手

UDP

非连接的协议,传输数据之前源端与终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽 的限制

在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包


Socket

前面的图中没有Socket存在,看下图:

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

**服务器端:**服务端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。

**客户端:**若有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,连接建立。

客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束


理论学习基本完成,接下来在计算机本地实现通信