目录
TCP/IP协议体系结构中的主要传输层协议,与OSI/RM区别。
主要特性:
(1)面向连接的传输协议;
(2)仅支持单播传输,不支持多播和广播。每条TCP传输连接只能进行端点对端点传输(端点指的是套接字socket,由IP和端口号组成,如(IP,PORT)或{socket1,socket2}或者{(IP1,Port1),(IP2,Port2)})。
(3)提供可靠的交付服务。
(4)传输单位为数据段。
数据段大小由应用层传送的报文大小和所途经网络中MTU值得大小决定,所以每次发送的TCP数据段大小不固定。在一个具体的网络中,有一个MSS(Maximum Segment Size,最大数据段大小),最小数据段可能仅有21个字节(其中20字节属于TCP数据段头部,数据部分仅1个字节)
(5)仅一种TPDU格式。
不会像OSI/RM中有10多种不同格式的TPDU。因为TCP数据段头部已包括了各种TPDU所需的特征字段(通过多个控制位实现)
(6)支持全双工传输。通信双方都能发送和接收数据。
(7)TCP连接是基于字节流而非报文流的
(8)每次发送的TCP数据段大小和数据端数都是可变的
根据对方给出的窗口大小和当前网络的拥塞程度来决定
两个因素决定了数据段的大小:
一是每个TCP数据段大小必须符合IP数据报的65515个字节的有效载荷限制要求。一个IP数据报最大不能超过65535字节,即64KB,报头最小是20字节。
二是每个网络都有一个MTU值(其实是数据链路层帧的大小),所以每个TCP数据段必须适合于MTU的限制要求
(1)源端口source prot和目的端口destination port
与主机IP构成套接字socket
(2)序号sequence number
在一个TCP连接中,传送的数据字节流中的每一个数据字节都要按顺序进行标号,整个要传送的字节流的起始序号必须在连接建立时设置。
(3)确认号acknowlegment number
指期望接收到对方下一个数据段中“数据”部分的第一个字节序号。
表示在此数值之前的所有数据对方已经连续正确接收了(不是代表已经正确接收到最后一个字节的序号),因为在两个已正确接收的数据段之间可能会有一个或多个数据还没有正确接收。
例如:B主机正确接收到101、201后还接收了501、601数据段,返回的ACK数据段的确认号应该是301,而不是501、601,因为中间的301、401还没正确接收到。
(4)数据偏移
也叫“TCP头部长度”,因为除了20字节固定还有可选项(最多40字节),占4位(最大表示1111,即15),以4字节为单位,头部最大为15*4=60字节。
(5)保留reserved,全0
(6)URG紧急指针控制位
在数据发送端指出当前发送的数据段是否有紧急数据(即1)。紧急数据会优先安排传送,不会按排队顺序发送。当本字段置1时,后面的紧急指针才有意义。
(7)ACK
Acknowledgement确认控制位,指示TCP数据段中的确认号字段是否有效。1表示有效,应用层实体在读取数据时可以不管确认号字段。
(8)PSH
Push推控制位,用于指示接收端是否需要立即把收到的该数据段提交给应用进制。
(9)RST
Rest重置控制位,用于重置、释放一个已经混乱的传输连接,然后重建新的传输连接。为1时释放当前连接,然后可以重新建立新的传输连接。
(10)SYN
Synchronization同步控制位,用来在传输连接建立时同步传输连接序号。为1时,表示这是一个连接请求或连接确认报文。当SYN=1,ACK=0时表明这时一个连接请求数据段。如果对方同意建立连接,则对方会返回SYN=1,ACK=1的确认。
(11)FIN
Final最后控制位,用于释放一个传输连接。当FIN=1表示数据已全部传输完成。
当发送端没有数据要传输时可以要求释放当前连接,但接收端仍然可继续接收还没接受完的数。正常FIN=0。
(12)窗口大小
指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,即发送者当前还可以接收的最大字节数。
窗口大小字段的值告诉接收本数据段的主机,从本数据段中所设置的“确认号”值算起,本端目前允许对端发送的字节数,是作为让对方设置其发送窗口大小的依据(我这还有多少缓冲区,你可以发送多少数据)
例如:本次发送的数据段“确认号”字段值501,而数据段的“窗口大小”字段值是100,则从501算起,本端还可以接收100个字节。
(13)校验和Checksum
(14)紧急指针Urgent Pointer
仅当前面的URG=1时才有意义,它指出本数据段中紧急数据的字节数。即使当前窗口大小为0,也是可以发送阶级数据,因为紧急数据无需缓存。
(15)可选项Option
可选项包括:窗口缩放选项Wsopt=window scale option、MSS(最大数据段大小)选项、SACK(选择确认)选项、时间戳(Timestamp)选项等。
每个TCP数据段大小必须符合IP数据包65535字节的有效载荷大小限制,最大为65535-20=65515个字节。
(16)数据Data
Socket不能等同于TSAP,只是雷士,实际上Socket只是包括了TASP地址——传输层端口。
TCP/IP中,区分不同应用程序进程间的网络通信和连接主要有3个参数:
通信目的IP地址、使用的传输层协议(TCP/UDP)、使用的端口号。
3个参数结合起来与一个Socket绑定来区分。
TSAP位于传输层上边缘(仍属于传输层),而socket完全位于应用层,但它调用了传输层的端口。
Socket包括了TSAP地址,还包括传输层的服务原语。
服务器端的原语执行:
1.SOCKET原语调用创建一个端点,返回文件描述符;
2.创建后是没有网络地址的,现需要通过BIND原语绑定分配;
3.绑定后调用LISTEN原语,分配缓存空间,以便后面的连接排队,使多个客户可以同时访问一个服务器.此时服务器还不是阻塞状态(即还没有进入等待连接状态);
4.当一个请求连接的TCP数据段到时,通过调用ACCEPT原语船舰一个新的套接字并返回一个与其关联的文件描述符。这个新的套接字与原来由SOCKET原语创建的套接字具有相同的属性。这时,服务器就可以调用一个进程来处理这个套接字上新来的连接,而服务器本身又回去继续等待原套接字上的下一个连接。
客户端的原语调用:
1.由SOCKET原语创建一个新的套接字,这里不需要绑定网络地址,即客户端不必调用BIND原语;
2.通过CONNECT原语阻塞客户端,并主动发起一个TCP连接。即收到服务器端发来的确认数据段后,客户端进入被解除阻塞状态,建立传输连接。
此时,服务器端和客户端都可以使用SEND和RECV原语进行数据的收发。
当双方都执行了CLOSE原语后,连接才会真正释放。
端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲区,属于软件接口范畴,是传输层TASP地址。
(1)保留端口
0-1023,常规端口、公认端口。
(2)动态分配端口
大于1024的端口号,可被动态分配给应用程序使用
(3)注册端口
也是固定为某个应用服务的端口,是某个软件厂商开发的应用程序,如CCProxy的8080端口,一般大于1024
TCP Socket服务原语有8个,比OSI/RM少。
把在TCP传输连接的建立和释放中的通信双方主机的状态称为“有限状态机”Finite State Machine FSM
方框:表示通信主机在不同时期的状态
箭头:表示状态之间的转换
粗线:表示客户端主动与服务器端连接建立的正常过程。
其中,客户端的状态转移用带箭头的粗实线表示,
服务器端用带箭头的粗虚线表示
带箭头的细实线表示一些不常见的事件,如复位、同时打开、同时关闭等。