Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCP/IP #23

Open
Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Open

TCP/IP #23

Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Labels
Projects

Comments

@Lmagic16
Copy link
Owner

Lmagic16 commented Oct 12, 2017

维基百科

TCP/IP协议族

  • OSI七层模型与TCP/IP五层模型
    OSI七层模型与TCP/IP五层模型
    维基百科中将TCP/IP的数据链路层和物理层看作网络接口层。
  • 网络层
    IP协议,其支撑协议:ICMP、ARP、RARP、IGMP;
    IP协议:不可靠、无连接的数据报协议,尽最大努力的服务,不提供差错检测或跟踪;
  • 传输层
    UDP协议:提供无连接通信,且不对传输包进行可靠性确认;

TCP特性

  • 提供一种面向连接的、可靠的字节流服务;
  • TCP使用校验和,确认和超时重传机制来保证可靠传输;
  • TCP给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复;
  • TCP使用滑动窗口机制来实现流量控制,可动态改变窗口的大小;
  • 使用拥塞窗口进行拥塞控制,指数或线性增长控制窗口大小;
  • 发送方的发送窗口是取滑动窗口和拥塞窗口的最小值;
    注意: TCP 不是 100% 可靠的协议,它所能提供的是数据的可靠递送和故障的可靠通知。

TCP和UDP的区别

TCP面向连接、采用流模式、保证报文的顺序和正确性
UDP无连接、不保证报文的正确性,可能丢包
UDP相对来说,效率高、速度快、占用资源少、不可靠

三次握手

TCP以全双工方式发送数据,为了保证在不可靠信道上数据的可靠传输。
三次握手建立连接的目的:知道双方的存在,同步开始序列号,协商一些参数。
1. 过程
TCP三次握手建立连接
a. 发送方发送同步报文,即SYN标志位为1,以及同步的初始序列号seq=x。
b. 接受方收到后,知道对方要和我同步初始序列号,并建立连接。于是发送同步+确认报文,即发送SYN,ACK标志位都为1,以及同步的初始序列号seq=y,和期待收到的下一个报文的序列号ack=x+1。
c. 发送方收到接收方的信息后,知道自己的信息已经成功发送到收方,并且收方也确认和我同步序列号。这时候发送方会发送确认报文,即ACK=1,seq=x+1,ack=y+1。于是建立连接,双方已经同步序列号,之后双方可以互发数据。
ack的作用是告诉对方自己已经收到的序列号和期望收到的序列号。
2. 为什么需要三次握手?
a. 在两次握手之后,发送方知道自己的同步序列号已经到达对方,并且知道对方的初始序列号。但这时候,接收方不知道自己的序列号有没有正确发往发送方。为了双方正确同步序列号,需要三次握手。假如两次握手可能会带来资源浪费的问题。如果A往B第一次发送的请求因为网络原因卡住,A会再次往B发送请求建立连接,若A和B的第二次连接正常,传输数据后正常断开之后,A的第一次请求网络好了这时候到达了B,B会以为这是A的正常请求,B回复了ack之后,如果没有三次握手,连接就建立了,服务器会为该连接分配资源,但其实A根本没有想要建立该链接。这样就会浪费不必要的资源。
b. 从宏观的角度来说,为了能在不可靠的信道上进行可靠的全双工通信,最小的交互的次数是三次。第一次握手,接收方知道他的接收信道没有问题;第二次握手,发送方知道他的发送信道和接收信道都没有问题,这时候,接受方不知道它的发送信道有没有问题。所以还需要一次握手,这样双方都能确定自己的接收和发送信道没有问题。

四次挥手

1. 过程
TCP连接释放
a. 发送方发送FIN=1表示自己没有数据再往对方发送,附带自己的序列号seq=u;
b. 接收方收到之后,回复ACK,ack=u+1表示已经收到。附带自己的序列号seq=v;
c. 接收方发送FIN=1表示自己没有数据要发送,附带ack=u+1和序列号seq=w;
d. 发送发收到对方的FIN之后,回复ACK,ack=w+1表示自己已经收到,此时连接释放,附带自己的序列号seq=u+1。
2. 为什么需要四次挥手?
因为TCP是全双工通信,可能A没有数据发往B,但B这时候可能还有数据要发往A。
github链接

@Lmagic16 Lmagic16 added this to 网络 in 网络 Oct 12, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
网络
网络
Development

No branches or pull requests

1 participant