TCP/IP四层模型
了解socket之前,有必要先了解一下TCP/IP四层模型
,四层模型的大致内容如下图所示,详细了解可以点击此处转跳。
Socket是什么呢?
Socket
在TCP/IP四层模型
中位于应用层与传输层之间,是一层抽象层,一组接口。在设计模式中,Socket是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
接口
可以被理解为是一个可被调用的函数,使用者只需了解如何调用,无需了解函数的内部复杂的逻辑,便于使用者的快速开发。
Socket
与TCP/IP四层模型
的关系如下:
Socket运行流程
Socket的运行分几个步骤,每个步骤都对应一个接口。
步骤(函数) | 描述 |
---|---|
socket()函数 | socket对象初始化 |
bind()函数 | 将唯一的网络地址赋给socket。这个唯一的地址就像是名片,身份证,通信双方可以通过这个地址来确认彼此 |
listen()函数 | 监听socket对象。就像是平时打电话,要想接收信息,你就要时刻将话筒贴在耳边去监听电话的另一头 |
accept()函数 | 接收函数。要想建立连接,就需要先确认对方此刻空闲,可以连接。接收函数就是用来接收对方的空闲应答的 |
connect()函数 | 双方通过connect()函数连接,构建交流的“桥梁” |
read()、write()函数 | 用于实现信息的交互 |
close()函数 | 用于结束信息的交互,关闭沟通的“桥梁” |
Socket的信息交互时序图如下:
TCP的报文结构
数据名称 | 描述 |
---|---|
源端口、目的端口 | 各占2个字节,分别写入源端口号和目的端口号 |
序号 | 占4个字节。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号” |
确认序号 | 占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到 |
数据偏移 | 占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。故TCP首部的最大长度为60字节 |
保留 | 占6位,保留为今后使用,目前置为0 |
紧急URG | 当URG=1,表明紧急指针字段有效。这时发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据 |
确认ACK | 当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1 |
推送PSH | 接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付 |
复位RST | 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接 |
同步SYN | 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文 |
终止FIN | 用来释放连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接 |
窗口 | 占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据 |
检验和 | 占2字节。检验和字段检验的范围包括首部和数据这两部分 |
紧急指针 | 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数 |
TCP三次握手连接流程
- 第一次握手:客户端主动打开,发送连接请求报文段,将SYN标识位置为1。
- 第二次握手:服务器收到SYN报文段进行确认(ACK),将SYN标识位置为1,ACK置为1,这个状态被称为半连接状态。
- 第三次握手:客户端再进行一次确认(ACK),将ACK置为1(此时不用SYN)。
三次握手的目的
第一次:让服务器知道,从客户端到服务器的连接是通的。(客户端对服务器说:我想给你发数据)
第二次:让客户端知道,从服务器到客户端的连接是通的。(服务器对客户端说:我能收到,你发吧 — 确保上行通道)
第三次:让服务器知道,从服务器到客户端的连接是通的。(客户端对服务器说:我知道你收到我的请求了,那我发了 — 确保下行通道)
TCP四次挥手(握手)断开流程
四次挥手的目的
因为对于断开链接,发送方和接收方都需要获取对方的终止信号(FIN)和对终止的确认信号(ACK),所以需要四次挥手。
第一次:客户端对服务器说:到点了,我要走啦。
第二次:服务器对客户端说:好吧,我知道你要走了。
第三次:服务器对客户端说:那我也走啦。
第二次:客户端对服务器说:好,我也知道你要走了。