网络是怎样连接的

套接字中记录了用于控制通信操作的各
种控制信息,协议栈则需要根据这些信息判断下一步的行动,这就是套接
字的作用。
协议栈是根据套接字中记录的控制信息来工作的。

本地IP 地址和远程IP 地址都是0.0.0.0,这表示通信还没开始,IP 地址不
确定

浏览器通过Socket 库向协议栈发出委托

浏览器委托协议栈使用TCP 协
议来收发数据

创建套接字时,首先分配一个套接字所需的内存空间,然后向其
中写入初始状态。
接下来,需要将表示这个套接字的描述符告知应用程序。描述符相当于用来区分协议栈中的多个套接字的号码牌

通过客户端IP 地址、客户端端口号、服务器IP 地
址、服务器端口号这4 种信息可以确定某个套接字,那么要指代某个套接
字时用这4 种信息就好了,为什么还要使用描述符呢?这个问题很好,不
过我们无法用上面4 种信息来代替描述符。原因是,在套接字刚刚创建好,
还没有建立连接的状态下,这4 种信息是不全的。此外,为了指代一个套
接字,使用一种信息(描述符)比使用4 种信息要简单。出于上面两个原
因,应用程序和协议栈之间是使用描述符来指代套接字的。

==============

小豆角:
ip地址是分配给网卡的

小豆角:
网络控制软件叫协议栈

小豆角:
协议栈把应用程序接受的消息打包,然后加上目的地址等控制信息,就像邮局 把信装进信封,写上收件人地址

小豆角:
可以当做帮忙寄信的小秘书

小豆角:
然后协议栈,也就是网络控制软件会把 包交给网卡,负责以太网或者无线网络的硬件,网卡会把包转换为电信号并通过网线发出去,这样 包就进入网路中了

小豆角:
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口

小豆角:
 端口号:用来辨别本地通讯进程

小豆角:
端口是tcp范畴的东西

小豆角:
tcp的包是不包含ip地址信息的,那是ip层的事,但是tcp有源端口和目的端口。就是说,端口是属于tcp知识范畴

小豆角:
进程在计算机内部进行通信,可以有管道、内存共享、信号量、消息队列等方法,两个进程能够通讯的最基本前提是能够唯一的标识一个进程。在本地进程通训中可以用pid来唯一标识一个进程

小豆角:
跨机器pid不好用,解决办法是在传输层使用协议端口号,简称端口。ip地址唯一标识主机,而tcp层协议和端口可以唯一标识主机的一个进程。这样就可以用哪个ip地址+协议+端口号,唯一标识网络中的一个进程,也常把这种唯一标识的模式称为套接字

小豆角:
一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口、外地地址、外地TCP端口。套接字对唯一标识一个网络上的每个TCP连接。

小豆角:
Socket最初作为UNIX操作系统的一部分而开发的,所以其API和系统其他IO设备集成在一起,当创建一个Socket是,操作系统返回一个int型的变量作为描述符,用来标志这个Socket,然后应用程序通过该描述符作为传递参数,通过调用函数来完成收发网络数据。


用描述符指向之前穿件的socket结构


“能不能用前面创建套接字时提到的那个描述符来识别
套接字呢?”这种方法其实是行不通的,因为描述符是和委托创建套接字的
应用程序进行交互时使用的,并不是用来告诉网络连接的另一方的,因此
另一方并不知道这个描述符。同样地,客户端也无法知道服务器上的描述
符。因此,客户端也无法通过服务器端的描述符去确定位于服务器上的某
一个套接字。所以,我们需要另外一个对客户端也同样适用的机制,而这
个机制就是端口号。如果说描述符是用来在一台计算机内部识别套接字的
机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制A


,客户端在创建套接字时,协议栈会为这个套接
字随便分配一个端口号A。接下来,当协议栈执行连接操作时,会将这个随
便分配的端口号通知给服务器


当调用connect 时,协议栈就会执行连
接操作。当连接成功后,协议栈会将对方的IP 地址和端口号等信息保存在
套接字中,这样我们就可以开始收发数据了。


描述符:应用程序用来识别套接字的机制
IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制

原文地址:https://www.cnblogs.com/xiaodoujiaohome/p/10472770.html