网络编程(二) TCP报头
一、TCP报头
1、TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口、目的端端口、管理TCP连接等。TCP头部结构包括固定头部结构和头部选项。
2、TCP固定头部结构如图所示:
(1)16位源端口号/目的号:说明这个报文是来自哪里;要传给哪个上层协议。进行TCP通信时,客户端一般使用系统自动选择的临时端口号,服务器则会有指定的端口号。
(2)32位序号:序号:报头的编号;一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
具体怎么来呢? 第一个随机值,之后的被系统设置为第一个随机值(ISN)加上该报文段所携带的第一个字节在整个字节流中的偏移 。比如发送“hello world”分为两个报文段,先发送“hello”这个字节流,第一个是h,偏移量是0;第二次发送“world”,因为前边“hello ”一共六个字节,所以发送“world”时它的序号为“TSN+6”。由此说明数据越往后序号越大,根据这个也就能对字节流进行排序,序号值大的在后面,序号值小的在前面。
(3)32位确认号:因为发送SYN会回复ACK,但是如果发送多个SYN,都回复了ACK,如何将SYN 和ACK对应呢?
所以确认号用作对另一方发送的TCP 报文段的回应,具体的值是收到的报文段序号值+1。
(4)4位头部长度:标识该TCP头部有多少个4字节。4位最大为“1111”是15,所以TCP头部最长为60个字节,(前边五行4*5=20个字节,所以在选项字节最多40个),这一部分可以区分报文段和发送的真实数据。
(5)6位标识位:
URG:紧急指针是否有效。
ACK:确认号是否有效,因为由ACK标志的报文段才是确认报文段。
PSH:提示接收端应用程序应该立即从接收缓冲区读走数据,因为后边还在发送数据,不能占用空间,要及时将看空间腾出来保证后边的数据能进来。
RST:要求对方重新建立连接。
SYN:请求建立连接。
FIN :断开连接请求,通知对方自己这一端将要关闭连接了。
(6)16位窗口大小:它是TCP流量控制的一个手段。 窗口:接收通告窗口。
这个数字在整个传输过程都在变化,它就是告诉对方自己的TCP接收缓冲区还能容纳的字节数。这样对方就能控制自己发送数据的速度。
(7)16位校验和:由发送端填充,接收端对TCP报文段执行CRC(冗余检测)算法以检验TCP报文在传输过程中是否损坏。 它不仅校验TCP头部,也校验数据部分,这是TCP可靠传输的一个重要保障。
(8)16位紧急指针:它是一个正的偏移量,它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。
也就是如果有一段数据要立马紧急处理,那么它前面的数据先不管,只要这个数据一过去就先处理它。
(9)选项部分:一般不填充。
TCP和UDP的不同之处有一点是TCP可靠,而UDP不可靠。
那么TCP的可靠在哪体现呢?
因为UDP和TCP的报头不同,所以从报头去分析比较体现TCP的可靠性。结合TCP头部结构的固定结构,从数据的有序、完整、正确等方面去说明TCP的可靠性。