初级网络技术2
首先补充一下每一层协议相对应的端口(很重要)
应用层协议端口号:http (80 tcp的80)https(443/tcp)
电子邮箱协议:pop3(tcp 110 ) smtp(tcp 25)
文本传输协议(ftp 20 21/tcp ),tftp(udp 69)
远程控制服务(telnet 23 ssh 22 Rdp 3389)
域名解析协议:dns:tcp/udp 53
TCP 16位源端口(大于1023的) 16位目的端口(根据协议选择目的端口,如果对方是http协议 这里就是80端口)
疑惑:那么为什么源端口是随机的呢???不能是80??这样不是更容易记住吗???
解:因为源端口也和目的端口一样,要考虑到端口占用的问题,比如如果想要访问对方80端口,自己本身也开了http服务,如果源端口也为80,那么http访问http?这是行不通的。
之所以要大于1023,因为在这之下的端口都基本已经被其他常用协议使用了。
32位序列号:当数据过大时就会将数据进行分包,对方收到这一系列数据包过后,按照序列进行一一排序最后得到完整的数据包,体现出TCP的有序性
32位确认号:2确认位:pc1将数据编号如100发送到pc2,pc2收到对应的数据会向pc1回复一个已经收到数据100的确认号,如果pc2没有回复确认收到100的数据包,则pc1会重新传递一个100的数据包给pc2直到收到100的确认包,体现TCP的可靠性
TCP首部长度:最低(同时是默认)是20个字节,通过选项字段可以扩展到60个字节(20默认+可变长度(0-40字节)),选项字段是来添加功能的
(所以长度为20-60)
TCP报文=首部长度(报头)+数据长度
再这之后是Flag字段标志位
SYN:建立连接标志位,和面向连接有关
ACK字段:确认号标志位,和面向连接有关
然后就是TCP的通过三次握手建立连接:
情景:两台主机,pc1和pc2建立连接
首先pc1向pc2发送一个数据包,数据包内syn置1表示我想要和你建立连接,同时生成一个随机的序列号,pc2在收到了pc1给的数据包syn置1,就知道pc1想要和它建立连接,pc2发送的数据包就将ack置1代表确认,同时建立连接是双向的pc2也将syn置1,代表我也想pc1建立连接,同时生成一个确认号(序列号加一),代表我收到了您的数据包请发送下一个,同时也要生成一个序列号。pc1收到pc2发来的数据包过后,看见ack为1,则pc1到pc2的单向连接建立成功,看见数据包syn置1,就明白了pc2也想和它建立连接,pc1发包,把ack置1代表同意请求,再生成一个序列号,和一个确认号,发送给pc2,pc2收到过后看到ack置1,则代表pc2向pc1的单向连接建立成功,至此双向连接建立成功。
FIN拆除连接标志位:
然后就是TCP四次挥手拆除连接,和FIN和ACK有关
情景:已经建立连接的pc1和pc2想要断开连接
首先pc1向pc2发送一个数据包,数据包FIN置1代表想要断开连接,同时也会生成一个序列号,pc2收到pc1发送的数据包过后,看见FIN置1,就明白了想要断开连接,pc2发送一个数据包,ack置1代表我同意了,同时也会生成一个确认号(我收到了,你不用反复提醒我),pc1看见过来的数据包ack置1,就明白了pc2同意了。至此pc1到pc2的单向连接拆除成功。
然后当pc2到pc1的数据传输服务啊,这些东西结束之后,pc2到pc1的连接也要拆除了。Pc2就向pc1发送一个数据包,数据包内FIN置1代表我想要和你拆除连接,同时也会生成一个序列号,pc1收到过后,看见FIN置1就明白了,pc2想和它拆除连接,pc1就发一个数据包,数据包内ACK置1代表同意,同时也有一个确认号,代表我收到了。当pc2收到pc1的数据包,看见了ack置1,就明白了,OK你同意了。至此pc2向pc1的连接拆除.pc2和pc1之间的连接正式拆除完毕
疑惑:那么为什么挥手拆除连接要四次呢?不能将第二次和第三次的数据包合并在一起?像三次握手一样???
解:为了保证数据完整性。如果合并在一起,那么pc2到pc1的连接通道关闭,服务还没有完成的话,数据包就会丢失,pc2到pc1的服务完成也是需要时间的。
就比如下载电影这个过程,pc1向pc2发送一个请求“我要下电影”,OK这时候pc1到pc2就没事干了,一下这个请求就发过去了,pc1到pc2的连接就可以关闭。但是pc2呢???还需要把电影的数据包一个一个发送给pc1,如果和pc1到pc2的连接一起关,那么电影怎么下啊???所以过一会时间,等到pc2电影传给pc1传完了,pc2就会发送一个断开连接的请求,”我弄完了,这个连接可以关。”,这样就保证了服务的正常的进行,数据包的完整性。
RST:复位标志,置1表示拒绝错误和非法数据包 可靠性有关
校验没通过对面返回的数据包就会把RST置1,代表数据包错误,或者是没收到。
URG:紧急标志位,一般来说配合16位紧急指针使用,和流量控制有关(我自己赶快发,让本地把这个数据加急一下) 流量控制有关
PSH:对方收到数据后,快速交给应用层(对方收到数据后赶紧进行处理)
16位紧急指针:和URG配合,加急的。流量控制那方面