#简述
在我们使用客户端的时候,客户端是如何通信的呢?
下面就简单的说说看
#通信流程
下面是流程图
通信的基础是TCP/IP模型
#服务器搭建
##服务器搭建流程
##网络通信的基础知识
TCP/IP 四层协议
- 应用层:为网络排错,文件传输,远程控制和 Internet 操作提供具体的应用程序
- 传输层:为网络提供了流量控制,错误控制和确认服务. TCP(传输控制协议)和 UDP(用户数据报协议).
- 网络层:提供独立于硬件的逻辑寻址,实现物理地址与逻辑地址的转换.在 TCP / IP 协议族中,网络层协议包括 IP 协议(网际协议),ICMP 协议( Internet 互联网控制报文协议),以及 IGMP 协议( Internet 组管理协议)
- 网络接口层:主要是指物理层次的一些接口,比如电缆等.
TCP报文段首部格式
此部分是传输层数据封装,封装后给网络层,IP数据包
- 源端口和目的端口:各占2个字节。**源端口:**源端口和IP地址的作用是标识报文的返回地址 **目的端口:**端口指明接收方计算机上的应用程序接口。
- 序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
- 确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效Ack=Seq+1。
- 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- (A)URG:紧急指针(urgent pointer)有效。
- (B)ACK:确认序号有效。
- (C)PSH:接收方应该尽快将这个报文交给应用层。
- (D)RST:重置连接。
- (E)SYN:发起一个新连接。
- (F)FIN:释放一个连接。
需要注意的是:
- 不要将确认序号Ack与标志位中的ACK搞混了。
- 确认方Ack=发起方Req+1,两端配对。
数据包
- 在 TCP / IP 协议中数据先由上往下将数据装包,然后由下往上拆包。
- 在装包的时候,每一层都会增加一些信息用于传输,这部分信息就叫报头。
- 当上层的数据到达本层的时候,会将数据加上本层的报头打包在一起,继续往下传递.
- 在拆包的时候,每一层将本层需要的报头读取后,就将剩下的数据往上传.(俄罗斯套娃来形容这个过程.)
网络接口层
这一块主要主要涉及到一些物理传输,比如以太网,无线局域网.这里就不做详细的介绍了
网络层/IP数据报
TCP/IP协议定义了一个在局域网上传输的包,称为IP数据报(IP Datagram)。
IP数据报由两部分组成
- 首部
- 数据
TCP数据报与IP数据报的关系
- IP数据包包含 tcp数据包 udp数据包,IP是第三层(网络层)的协议,
- TCP与UDP都属于第四层(传输层)的协议。
以后详细展开
IP 地址分为两个部分:
- 网络 ID
- 主机 ID
但是具体哪部分属于网络 ID,哪些属于主机 ID 并没有规定. - A 类地址:IP 地址的前 8 位代表网络 ID ,后 24 位代表主机 ID。
- B 类地址:IP 地址的前 16 位代表网络 ID ,后 16 位代表主机 ID。
- C 类地址:IP 地址的前 24 位代表网络 ID ,后 8 位代表主机 ID。
应用层
应用层做为 TCP/IP 协议的最高层级,对于我们移动开发来说,是接触最多的。
同样的,由于应用层我们需要涉及的东西太多,具体的介绍我们将在之后的文章中进行
- 运行在TCP协议上的协议:
- 运行在UDP协议上的协议:
- 其他:
SocKet
TCP服务端
- socket与IP和端口号链接是绑定 (bind)
- listen监听,赋予监听能力
- accept与Tcp客户端connect 建立三次握手
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
在socket编程中,这一过程由客户端执行connect来触发
确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。
- (1)第一次握手:Client将标志位SYN置为1,随机产生一个值(序列号)seq=J(200),并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,(确认号)ack=J(200)+1,随机产生一个值(序列号)seq=K(500),并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- (3)第三次握手:Client收到确认后,检查(确认号)ack是否为J(200)+1,ACK是否为1,如果正确则将标志位ACK置为1,(确认号)ack=K(500)+1,并将该数据包发送给Server,Server检查(确认号)ack是否为K(500)+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了.
TCP/IP数据封装包
协议加工过程
比如数据Hello ,进行封包
- linux核心模块网络管理,可以进行Soxket API 网络编程
- Socket就是建立一个通道,每次建立一个Socket通道就是建立一个协议的加工厂
- 协议加工长中有 端口号,IP,以太网协议
- 点到点(PC之间通过Ip号来锁定),端到端(PC唯一的进程(端口号));比如两个电脑上各开启两个QQ,其中每个电脑的QQ都有相同的IP,不同的端口号
- 互联网的唯一锁定是:IP + 端口号