1.


 

/*TCP头定义,共20个字节*/
typedef struct _TCP_HEADER 
{
 short m_sSourPort;              // 源端口号16bit
 short m_sDestPort;              // 目的端口号16bit
 unsigned int m_uiSequNum;         // 序列号32bit
 unsigned int m_uiAcknowledgeNum;  // 确认号32bit
 short m_sHeaderLenAndFlag;        // 前4位:TCP头长度;中6位:保留;后6位:标志位
 short m_sWindowSize;            // 窗口大小16bit
 short m_sCheckSum;              // 检验和16bit
 short m_surgentPointer;           // 紧急数据偏移量16bit

}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;

源端口和目的端口:字段长度均为16位,它们标识了源和目的应用程序。我们通常所说的端口号是指目的端口来说的,而源端口一般来说是个随机的值。
序列号:字段长度为32位,序列号用来确定发送方发送的数据流中被封装的数据所在的位置。如果当前这段数据的序列号为1000,且数据段长100个字节,那么下一段数据段的序列号就应该为1000+100+1=1101。
确认号:字段长度为32位,确认号确定了源点下一次希望从目标接受的序列号。
报头长度:长度为4位,报头长度和ip的首部长度相类似,同样是包含4字节的位数,这里不做描述。
保留:4位,


标记:8位,后6位分别是URG(紧急指针)、ACK(确认序号有效)、PSH(接收方应该尽快将这个报文段交给应用层)、RST(重建连接)、SYN(同步序号用来发起一个连接)、FIN(发送端完成发送任务)。
窗口大小:窗口大小为16位,这个值是接收端正期望接受的字节。因为窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
校验和:16位,覆盖了TCP的报头和数据部分。
紧急指针:这个字段只有当URG标记置位时才被使用。
可选项:此字段指明TCP的发送进程要求的选项。常用的可选项是最大段长度,用来指明本端所能接收的最大长度的报文段。

/*TCP头中的选项定义

kind(8bit)+Length(8bit,整个选项的长度,包含前两部分)+内容(如果有的话)

KIND = 1表示 无操作NOP,无后面的部分

  2表示 maximum segment   后面的LENGTH就是maximum segment选项的长度(以byte为单位,1+1+内容部分长度)

  3表示 windows scale     后面的LENGTH就是 windows scale选项的长度(以byte为单位,1+1+内容部分长度)

  4表示 SACK permitted    LENGTH为2,没有内容部分

  5表示这是一个SACK包     LENGTH为2,没有内容部分

  8表示时间戳,LENGTH为10,含8个字节的时间戳
*/

typedef struct _TCP_OPTIONS
{
 char m_ckind;
 char m_cLength;
 char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;



两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

  另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

  这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似。Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对Unix的内核来说,它无法区分一个二进制文件与一个文本文件。

tcp可以使用流模式,是由TCP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。UDP必须接收和发送一样的数据报大小。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐