1.封包和拆包
封包,就是发送数据前把自己本地需要发送的数据包装一下,即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息。有点像寄一封信,信封上填写的寄件人和收件人以及地址。
拆包,是接收到对方封包后发送来的数据后,拆出原始信息和对方的附加信息,以得知对方的来源。
像是拆信封。
2.TCP/UDP与socket
2.1 TCP 和UDP
- TCP 是面向连接的传输,需要通信双方完成三次握手成功后,才能正常通信,四次挥手后断开
三次握手的目的是为了 通信双方的设备都没有问题,
四次挥手是为了确保断开的双方本次通信连接时占用的内存全部释放掉。 - TCP 是基于字节流的传输,是按字节进行封装和发送的
- TCP 是可靠的传输,不允许有丢包,重复发送(对包后重发时),接收顺序出现错误等
- UDP 是面向无连接的,不需要握手
- UDP 是继续数据报文的,不是一个字节一个字节封装和发送的,是分块发送的
- UDP 是不可靠的传输,不负责接收方能够可靠的接收到消息,丢包后不会再做重发等弥补操作
- UDP 相比于TCP 来说比较快,效率更高,但它是不可靠的
2.2 socket介绍
- 一个端口号只允许一个进程占用,所以我们通过这个端口号就能找到特定的应用程序进程
- 两台主机之间通过网络通信需要知道 对方ip(最终解析成的ip)
- 想要两台主机的两个进程之间通信,就必须知道对方的 ip和端口号,
人们把ip加端口号抽象成了套接字,用来完成两台主机之前的进程通信,
套接字也叫Socket,人们实现了Socket的一些细节,并暴露出一些API接口,
供开发人员开发,我们叫它Socket API,SocketAPI 是提供开发者调用TCP 和UDP的api,
开发者不需要了解太底层,直接使用这些Api 就能实现TCP点对点通信,以及UDP的点播,多播和光播通信。
3.TCP/IP 协议族 示意图
3.主机A 向主机B 通信时 各层数据的流向
应用层(封包) ---->传输层(封包)---->网络层(封包)---->对方网络接口层(封包并发送数据)---->对方网络接口层(拆包)---->对方网络层(拆包)---->对方传输层(拆包)
如下图箭头1,2,3,4,5,6,7,8流向
主机B 向主机A 发送也是类似