套接字

套接字指通信双方在通信时所使用的通信点(Endpoint),通信的双方通过通信点来交换信息和数据。不同类型的通信会使用不同的类型通信点,比如对于电话通信而言,通信点就是电话号码和分机号码的组合,这时因为如果你想和朋友通话,就需要拨打你朋友的电话号码和分机号码。对于IP网络通信而言,通信点就是套接字,即两个进程在进行网络通信的时候,他们通过套接字来交换信息和数据。

和电话通信类似,当一个进程想和另一个进程进行网络通信时,它必须知道另外一个进程所在的目标机器IP地址,同时也必须有一种机制来标识目标机器上的进程,这种机制就是我们前面章节提到的端口号,目标机器正是通过端口号才能确定应该把接收到的数据发往哪一个进程。也就是说套接字这种通信点必须通过端口号标识和IP地址,另外由于网络通信也有不同类型,同一个端口号在使用不同的传输层协议时含义是不一样的,所以套接字还和传输层协议有关。

一个套接字包含:

  • IP地址
  • 端口号
  • 传输协议

一个已连接的TCP套接字对应如下:

【本地IP,端口,目标机IP,端口】

服务器可以分为迭代服务器和并发服务器

迭代服务器工作方式如下(UDP):

  • 等待客户请求
  • 当接受到客户请求时,处理该请求并把结果返回该客户
  • 回到步骤1,继续等待下一个客户请求。

并发服务器的工作方式如下(TCP):

  • 等待客户请求
  • 当接收到客户请求,为该客户开启一个新的服务器实例(进程、线程等),并且由这个新的服务器实例来处理该客户的请求并把结果返回客户,之后该新的服务器实例就终止。
  • 回到步骤一,继续等待下一个客户请求

TCP客户端与服务器交互过程

TCP服务器端连接套接字创建、关闭交互过程说明如下:

  1. 服务器创建一个套接字。
  2. 服务器把本地套接字地址(本地IP地址和本地端口)绑定(Bing)到该套接字。客户端将使用在这里的绑定的套接字地址来连接到该服务器
  3. 服务器把该套接字置为等待状态,也叫(Listen)这时套接字也被称为监听套接字。
  4. 服务器开始接受(Accept)客户端的连接请求。如果这时没有连接求,则服务器就等待请求的到来;如果有连接请求,则服务器为该连接请求创建一个新的套接字,该新的套接字用来描述这个连接,既它对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远程端口]。我们把这个新的套接字被称为已连接套接字,以便于区分监听套接字。
  5. 服务器使用已经连接的套接字来接受来自客户端的数据,或者发送数据到客户端。
  6. 当完成和客户端的数据交互之后,服务器关闭套接字。

一般来说,当服务器创建了已连接套接字后,会生成一个新的服务器实例(线程或进程等)。然后这个新的实例执行5,、6步,即处理和客户端的数据交互。

TCP客户端

TCP客户端连接套接字创建,关闭过程说明

  1. 客户端创建一个套接字
  2. 客户端把本地套接字地址(本地IP地址和本地端口)绑定到套接字。注意,这个步骤对于客户端来说不是必须的。如果执行的话就按四元组中的地址分配,如果没有执行则系统自动分配地址。
  3. 客户端使用在步骤1中创建的套接字来连接(Connect)到一个远程套接字的地址(远程IP地址和远程端口),即服务器的监听套接字地址。在连接成功之后,这个连接将由客户端套接字来描述,这个客户端套接字也对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远端端口]。此时,这个客户端套接字也成为一个连接套接字。
  4. 客户端使用已连接套接字发送来发送数据到服务器,或者接受来自服务器的数据。
  5. 当完成和服务器的数据交互之后,客户端关闭连接套接字。

这整个过程都只有一个套接字和一个客户端实例

最新文章

  1. Flexible 弹性盒子模型之CSS flex-grow 属性
  2. protobuf框架简介
  3. 大数据并行计算利器之MPI/OpenMP
  4. 利用HTML和JS制作隔行换背景颜色的表格
  5. hdu 1361 Parencodings 简单模拟
  6. svn import 向Google code里导入初始代码
  7. PHP 进行蜘蛛访问日志统计
  8. Android Studio代码自己主动提示无效(not available in Power Save mode)
  9. MJExtension
  10. 具有 CSA CCM 证明的 SOC 2 可简化 Windows Azure 客户的安全性评估过程
  11. js弹出对话框,遮罩效果,
  12. VIM 初步
  13. Java进阶(三十八)快速排序
  14. Mave手动安装jar包
  15. 使用前端技术和MySQL+PHP制作自己的一个个人博客网站
  16. 第六次作业———numpy数据集练习
  17. mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
  18. Windows BAT 命令下del 与 rd 命令
  19. Java内存模型-final域的内存语义--没明白,预留以后继续理解
  20. git 提交丢失Warning, you are leaving 2 commits behind,

热门文章

  1. hdoj-5099-Comparison of Android versions
  2. iOS设计模式之NSNotificationCenter 消息中心
  3. mysql-增删改数据
  4. svn服务器的搭建过程 主要为服务端
  5. Codeforces434D 网络流
  6. Swift学习笔记(5):集合类型
  7. MySql系列之初识
  8. CentOS下安装SVN服务端
  9. 题解 P1531 【I Hate It】
  10. 熟悉Android开发不得不知道的技巧