计算机网络学习--tcp学习

/*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必须接收和发送一样的数据报大小。
更多推荐
所有评论(0)