预备知识源IP地址和目的IP地址IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址 。两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是目的IP地址,因为两台主机是要进行通信的,所以接收方需要给发送方进行一个响应,这时接收方主机就需要知道发送方主机的IP地址,也就是源IP地址 。有了这两个地址,两台主机才能够找到对端主机 。
- 源IP地址: 发送方主机的IP地址,保证响应主机“往哪放”
- 目的IP地址: 接收方主机的IP地址,保证发送方主机“往哪发”
16位的整数
,用来标识主机上的某一个进程
注意:一个端口号只能被一个进程占用
在上面说过,公网IP地址是用来标识全网内唯一的一台主机,端口号又是用来标识一台主机上的唯一一个进程,所以IP地址+端口号 就可以标识全网内唯一一个进程
端口号和进程ID:二者都是用来唯一标识某一个进程 。它们的区别和联系是:
一台主机上可以存在大量的进程,但不是所有的进程都需要对外进行网络请求 。任何的网络服务和客户端进程通信,如果要进行正常的数据通信,必须要用端口号来唯一标识自身的进程,只有需要进行网络请求的进程才需要用端口号来表示自身的唯一性,所以说端口号更多的是网络级的概念 。进程pid可以用来标识所有进程的唯一性,是操作系统层面的概念 。二者是不同层面表示进程唯一性的机制 。
源端口号和目的端口号:两台主机进行通信,只有对端主机的IP地址只能够帮我们找到对端的主机,但是我们还需要找到对端提供服务的进程,这个进程可以通过对端进程绑定的端口号找到,也就是目的端口号,同样地,对端主机也需要给发送方一个响应,通过源IP地址找到发送方的那一台主机,找到主机还是不够的,还需要找到对端主机是哪一个进程发起了请求,响应方需要通过发起请求的进程绑定的端口号找到该进程,也就是源端口号,然后就可以进行响应 。
- 源端口号: 发送方主机的服务进程绑定的端口号,保证接收方能够找到对应的服务
- 目的端口号: 接收方主机的服务进程绑定的端口号,保证发送方能够找到对应的服务
注意:一个局域网才拥有一个独立的IP,IP地址只能定位到一个局域网,无法定位到具体哪台设备,要想定位到哪台设备,就必须知道这个设备的MAC地址,IP地址解决的是数据在外网(因特网,互联网)的传输问题,而MAC解决的是数据在内网(局域网)的传输问题,但是MAC地址不需要我们组包,链路层底层协议栈就会帮你组好 。
Socket套接字Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信 。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为
文件描述符(file descriptor)
,Socket 是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件 。文章插图
在网络通信中,套接字一定是成对出现的 。一端的发送缓冲区对应对端的接收缓冲区 。
经验总结扩展阅读
- 抓包分析 TCP 握手和挥手
- 概念+协议的了解+OSI七层模型,TCP/IP五层协议,网络数据传输流程 Linux--网络基础
- 关于网页实现串口或者TCP通讯的说明
- 如何kill一条TCP连接?
- TCP 序列号和确认号是如何变化的?
- 2d游戏怎么编程(怎么编写一个2d游戏)
- 怎么编写游戏程序(游戏外挂编写教程)
- Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
- 手写编程语言-如何为 GScript 编写标准库
- 编写HelloWorld并运行