目录
一、TCP协议介绍
1、TCP/IP协议族的传输层协议
2、TCP协议
二、TCP报文格式
三、TCP三次握手、四次挥手
1、TCP连接(三次握手)
2、为什么要进行三次握手?
3、四次挥手
4、关闭为什么是四次挥手?
四、UDP协议介绍
TCP (Transmission Control Protocol )传输控制协议
UDP (User Datagram Protocol )
TCP是面向连接的、可靠的进程到进程通信的协
TCP提供全双工服务,即数据可在同一时间双向传输
TCP报文段
面向连接网络协议,是指通信双方之间在进行通信之前要先建立连接。比如打电话,双方通话前需要先建立连接,等数据发送结束后,双方再断开连接。
无连接网络协议,是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包送到网络线路上,由系统自主选定路线进行传输。
TCP是面向连接的、可靠的进程到进程通信的协议。TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存和接收缓存,用来临时存储数据。
UDP协议是无连接、不保证可靠性的传输层协议。发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。传输数据速度更快,效率更高
源端口号:发送方进程的端口号。
目标端口号:接收端进程的端口号。接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。
序号:发送端为每个字节进行编号,便于接收端正确重组。
当TCP从进程接收数据字节时,把它们分片成数据段存储在发送缓存中,并对每一个字节进行编号。当数据到达目的地后,接收端会按照这个序号把数据重新排列,保证数据的正确性
确认号:对发送端的确认信息。
接收端响应消息时将会用它来告诉发送端这个序号之前的数据段都已经收到,如确认号是x,就是表示前x-1个数据段都己经收到。
首部长度:用它可以确定TCP首部数据结构的字节长度。一般情况下TCP首部是20字节,但首部长度最大可以扩展为60字节。
控制位:
URG:紧急位。紧急指针有效位。
ACK:确认位。只有当ACK=1时,确认序列号字段才有效:当ACK=0时,确认号字段无效。
PSH:急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。
RST:重置位。当RST值为1时,通知重新建立TCP连接。
SYN:同步(连接)位。同步序号位,TCP需要建立连接时将这个值设为1。
FIN:断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1.
窗口大小:说明本地可接收数据段的数目。这个值的大小是可变的,当网络通畅时接收端响应消息会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的。
比如下载速度从一开始的几KB逐渐提升到几MB的过程。
校验和:用来做差错控制。字段检验的范围包括首部和数据这两部分。数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据。
紧急指针:和URG配合使用,当URG=1时有效。
选项:在TCP首部可以有多达40字节的可选信息。例如,最大报文段长度MSS (Maximum Segment Size)。MSS告诉对方TCP: "我的缓存所能接收的报文段的数据字段的最大长度是MSs个字节。"
三次握手本质是确认双方收发数据的能力,建立TCP连接时要传输三个数据包。
1.由客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成的序列号)此时客户端处于 SYN-SENT状态
2.由服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ACK加1可以理解为是确认和谁建立连接。此时服务器处于 SYN-RCVD的状态。
3.客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。此时客户端处于 ESTABLISHED状态当服务器收到回复后 也处于 ESTABLISHED 状态(SYN=1,ACK=y+1,seq=x+1)
三次握手的目的确认双方的接收与发送能力是否正常,避免多次建立重复连接
第一次握手
:客户端发送网络包,服务端收到了。服务端可以确认客户端的发送能力、服务端的接收能力是正常的。
第二次握手
:服务端发包,客户端收到了。客户端可以确认:服务端的接收、发送能力,客户端的接收、发送能力是正常的。
第三次握手
:客户端发包,服务端收到了。服务端可以确认:客户端的接收、发送能力,服务端的发送、接收能力是正常的。
连接正常进行建立
1、客户端给服务端发送一个FIN,(FIN=1,Seq=u)用来关闭数据传送,断开连接,也是客户端告诉服务端:我已经不会再给你发数据了,但是客户端还是处于可以接受数据的状态。发送完断开连接请求后,客户端处于FIN_WAIT1(终止等待1)状态,等待服务端的确认。
2、服务端收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),表示已经收到客户端的断开请求,服务端处于 CLOSE-WAIT 状态,但是此时服务端可能还有数据尚未传送完毕。
3、当服务器无数据传输后,会发送一个FIN给客户端,(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)用来关闭数据传送,断开连接,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。发送完成之后,服务器服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
4、客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME-WAIT 状态。需要等待2MSL以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。
而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文
(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。
UDP协议
●无连接、不可靠的传输协议
●花费的开销小
UDP报文的首部格式
源端口号 |
目标端口号 |
UDP长度 |
校验和 |
数据 |
源端口号(16):发送端的端口号
目标端口号(16):接收端的端口号
UDP长度(16):用来指出UDP总长度,为首部加上数据
校验和(16):用来完成对UDP数据的差错检验,他是UDP协议提供的唯一的可靠机制
常用的UDP端口号
端口 |
协议 |
说明 |
69 |
TFTP |
简单文件传输协议 |
111 |
RPC |
远程过程调用 |
123 |
NTP |
网络时间协议 |
常用的TCP端口号及其功能
端口 |
协议 |
说明 |
20/21 |
FTP |
FTP服务器所开放的控制端口(20平时不开放) |
23 |
TELNET |
用于远程登录,可以远程控制管理目标计算机 |
25 |
SMTP |
SMTP服务器开放的端口,用于发送邮件 |
80/443 |
HTTP/HTTPS |
超文本传输协议 |
110 |
POP3 |
用于邮件的接收 |
67/68 |
DHCP |
服务端/客户端 |
53 |
Dns |
域名解析 |