TCP/IP协议是指因特网整个TCP/IP协议簇,从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。其中,网络层和传输层之间的区别是最为关键的:网络层( IP )提供点到点的服务,而运输层( TCP和UDP ) 提供端到端的服务 。
一 先来说说TCP/IP协议涉及到的一些基础和术语,比如分层、地址、域名、封装、分用、端口、socket等。
分层
TCP/IP四层对比OSI七层模型,如下图:
IP
互联网上的每个接口必须有一个唯一的Internet地址(也称作IP地址)。 IP地址长32bit 。 Internet地址并不采用平面形式的地址空间,如1、2、3等。 IP地址具有一定的结构,五类不同的互联网地址格式如图 1-5 所示。
端口
端口将应用进程与IP网络相关联,是应用进程的地址标识。
一个端口是一个16位号码。
端口分为公用和临时两种:
公用端口:属于标准服务器,由权威机构IANA统一分配,从1~1023。
临时端口:用于客户,从1024~65535。
Socket
为了使得多主机多进程通信时,不至于发生混乱情况,必须把端口号和主机的IP地址结合起来使用,称为插口或套接字(Socket)。
由于主机的IP地址是唯一的,这样目的主机就可以区分收到的数据报的源端机了。
套接字包括IP地址(32位)和端口号(16位),共48位。
例如(124.33.13.55,200)和(126.45.21.51,25)就是一对套接字,在整个Internet中,在传输层上进行通信的一对套接字都必须是唯一的。
域名
为了使用和记忆方便,因特网还采用了域名管理系统,简称DNS(Domain Name System),在IP地址之外,网上的计算机还有另一种表示法:域名,它是由代表一定意义的英文单词的缩写构成,如:

封装
当应用程序用TCP传送数据时, 数据被送入协议栈中, 然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息), 该过程如图1-7所示。 TCP传给IP的数据单元称作TCP报文段或简称为TCP段(TCPsegment)。 IP传给网络接口层的数据单元称作 IP数据报 (IPdatagram)。通过以太网传输的比特流称作帧(Frame)。
分用(可以当做封装的反过程)
二 下面重点说说TCP和UDP协议的基础知识:
1 TCP头部数据报文
源端口和目的端口字段——各占 2 字节。标识了发送方和接收方的应用进程。
序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移——占 4 bit,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
紧急比特 URG —— 当 URG 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认比特 ACK —— 只有当 ACK 1 时确认号字段才有效。当 ACK 0 时,确认号无效。
推送比特 PSH —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位比特 RST —— 当 RST 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,通知一下对方。
同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
终止比特 FIN —— 用来释放一个连接。当FIN 1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
窗口字段 —— 占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据和伪段头(不是TCP里的信息,但是计算校验和的时候也计算了的内容:IP地址,TCP数据段长度,协议类型)。
紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中的紧急数据的位置。
选项字段 —— 长度可变。TCP 规定了二种选项,最大报文段长度 MSS (Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。” 和窗口扩大因子,用于扩大接收方窗口
填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
2 TCP连接的建立与关闭
对比一下两图,一个是tcpdump抓包telnet操作的图、一个是对应的TCP状态图
建立连接
TCP协议提供可靠的面向连接服务,采用三次握手建立连接。
(1) 第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
(2) 第二次握手:服务器收到SYN包,向客户端返回ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;
(3) 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。
终止连接
采用四次挥手断开双向连接。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
3 TCP状态
LISTENING:侦听来自远方的TCP端口的连接请求.
SYN-SENT:客户端SYN_SENT状态,发送连接请求后等待匹配的连接请求
SYN-RECEIVED:服务器端状态SYN_RCVD
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
TCP状态变迁图
客户端的状态流程图:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器的状态流程图:
CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST->ACK->CLOSED
UDP(略)
浙公网安备 33010602011771号