2.1创建套接字
2.1.1协议栈的内部结构
浏览器丶邮件等一般应用程序收发数据时用TCP;DNS查询等收发较短的控制数据时候用UDP
2.12套接字的实体就是通信控制信息
在协议栈的内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信,例如通信对象的IP地址丶端口号丶通信操作的进行状态等. 本来套接字就不存在实体,如果一定要赋予它实体的话,我们可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体.
协议栈是根据套接字中记录的控制信息来工作的.
套接字内容:如图 图中只显示了部分内容
2.1.3调用socket时的操作
创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态
2.2连接服务器
2.21 连接是什么意思
话说,以太网的网线都是一直连接状态,我们并不需要拔插网线,那么连接是什么意识呢?
答:连接实际上是通信双方交换控制信息,在套接字中记录这些必要信息并准备数据收发的一连串操作,在讲解具体过程之前,我们先来说一说
"连接"到底是什么意思.
因为浏览器知道通信对象的信息(端口号 IP等信息),但是在调用socket创建套接字的时候这些信息并没有传递给协议栈.因此,我们需要把服务器的IP地址和端口号等信息告知协议栈,这是连接操作的目的之一
客户端向服务器传达开始通信请求,也是连接操作的目的之一.
控制信息:就是用来控制数据收发操作所需的一些信息,IP地址和端口号就是典型的列子.
补充:当执行数据收发操作时,我们还需要一块用来临时存放要收发的数据的内存空间,这块内存空间称为缓冲区,他就是在连接操作的过程中分配的.
2.2.2 负责保存控制信息的头部
2.3收发数据
2.31将HTTP请求消息交给协议栈
流程控制语句connect回到应用程序后,接下来就进行数据收发阶段了.
数据收发操作:从应用程序中调用write将要发送的数据教给协议栈开始的(图2.3圈3),协议栈收到数据后执行发送操作.
图2.3
协议栈不是收到数据就发送,一般需要先积累一定量的数据再发出去.积累多少根据不同种类和版本的操作系统会有所不同,不能一概而论.需要下面几个要素判断
1.第一个判断每个网络包能容纳的数据长度,协议栈会根据一个叫做MTU的参数进行判断.一般1500字节(是包含头部的总长度) 当从应用程序收到的数据长度超过或者接近MSS时在发送出去,就可以避免发送大量小包的问题.
2.时间:协议栈有一个计时器,当经过一定时间之后,就会把网络包发送出去(以毫秒为单位计算)
发送是综合考虑以达到平衡.
如果仅靠协议栈来控制发送时机,可能会带来一些问题,因此协议栈也给应用程序保留了控制发送时机的余地.(比如如果制定"不等待填满缓冲区直接发送",则协议栈就会按照要求直接发送数据 一般像浏览器这样会话型应用程序,等待填满缓冲区导致的延迟会产生很大的影响,因此一般会采用直接发送选项)
MTU : 一个网络包的最大长度,以太网中一般为1500字节
MSS:除去头部之后,一个网络包所能容纳的TCP数据的最大长度
对较大的数据进行拆分
请求消息一般不会太长,一个网络包就能装下,但是如果要提交表单数据,长度就可能超过一个网络包所能容纳的数据量.