首页 > 代码库 > 图解TCP/IP

图解TCP/IP

协议

协议就是计算机与计算机之间通过网络实现通信事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU以及不同的操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。反之,如果使用的协议不同,就无法通信。

 

技术分享

 

  分组交换是将大数据分割为一个个叫做包(Packet)的较小单位进行传输的方法。这里所说的包,就如同我们平常在邮局里见到的邮包。分组交换就是将大数据分装为一个个这样的邮包交给对方。

 

技术分享

 

  2.3 协议分层与OSI参考模型

  协议分层就如同计算机软件中的模块化开发,OSI参考模型的建议是比较理想化的。

 

技术分享

 

  OSI参考模型中每个层的作用:

 

技术分享

 

  7层通信实例:假设主机A的用户A要给主机B的用户B发送一封电子邮件:

 

技术分享

 

  发送方从第7层、第6层到第1层由上至下按照顺序传输数据,而接收端则从第1层、第2层到第7层由下至上向每个上一级分层传输数据。每个分层上,在处理由上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。然后接收端对收到的数据进行数据“首部”与“内容”的分离,再转发给上一分层,并最终将发送端的数据恢复为原装。

三、TCP/IP基础知识

 3.1 TCP/IP标准化

  (1)具体含义

  很多人都会认为TCP/IP是指TCP与IP两种协议,实际生活中有时也确实就是指这两种协议。然后,很多情况下,它只是利用IP进行通信时所必须使用到的协议群的统称。

技术分享

  (2)标准化

  由于TCP/IP尽早地制定了可行性较强的协议,提出了应对技术快速革新的协议,并及时进行后期改良的方案,因此打败了OSI模型,成为了事实上的标准。

  3.2 TCP/IP协议分层模型

技术分享

  上图列出了TCP/IP与OSI分层之间的大概关系,不难看出,TCP/IP与OSI在分层模块上稍有区别。OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。

  现在再来看看主机A向主机B发送一封电子邮件,在TCP/IP模型下的处理过程:

技术分享

  分组数据包经过以太网的数据链路时的大致流程如下图所示:

技术分享

 

 

 

socket套接字 API 讲解:

基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符。客户端随后调用connect 函数,服务器端则调用 bind、listen 和accept 函数。套接字通常使用标准的close 函数关闭,但是也可以使用 shutdown 函数关闭套接字。下面针对套接字编程实现过程中所调用的函数进程分析。以下是基于 TCP 套接字编程的流程图:

 

技术分享

三次握手

技术分享

socket 函数

套接字是通信端点的抽象,实现端对端之间的通信。与应用程序要使用文件描述符访问文件一样,访问套接字需要套接字描述符。任何套接字编程都必须调用socket 函数获得套接字描述符,这样才能对套接字进行操作。

connect 函数

在处理面向连接的网络服务时,例如 TCP ,交换数据之前必须在请求的进程套接字和提供服务的进程套接字之间建立连接。TCP 客户端可以调用函数connect 来建立与 TCP 服务器端的一个连接。

TCP 客户端在调用函数 connect 前不必非得调用 bind 函数,因为内核会确定源 IP 地址,并选择一个临时端口作为源端口号。若 TCP 套接字调用connect 函数将建立 TCP 连接(执行三次握手),而且仅在连接建立成功或出错时才返回

bind 函数

调用函数 socket 创建套接字描述符时,该套接字描述符是存储在它的协议族空间中,没有具体的地址,要使它与一个地址相关联,可以调用函数bind 使其与地址绑定。客户端的套接字关联的地址一般可由系统默认分配,因此不需要指定具体的地址。若要为服务器端套接字绑定地址,可以通过调用函数 bind 将套接字绑定到一个地址。

对于 TCP 协议,调用 bind 函数可以指定一个端口号,或指定一个 IP 地址,也可以两者都指定,还可以都不指定。若 TCP 客户端或服务器端不调用bind 函数绑定一个端口号,当调用connect 或 listen 函数时,内核会为相应的套接字选择一个临时端口号。一般 TCP 客户端使用内核为其选择一个临时的端口号,而服务器端通过调用bind 函数将端口号与相应的套接字绑定。

listen 函数

在编写服务器程序时需要使用监听函数 listen 。服务器进程不知道要与谁连接,因此,它不会主动地要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接。

accept 函数

accept 函数由 TCP 服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。

close 和 shutdown 函数

当要关闭套接字时,可使用 close 和 shutdown 函数

参考:

http://www.cnblogs.com/edisonchou/p/5987827.html  《图解TCP/IP》读书笔记

http://network.51cto.com/art/201412/459619_all.htm 基于TCP套接字

图解TCP/IP