TCP/IP详解

  1. 第五章 Internet协议
  2. 第十二章 TCP:传输控制协议(初步)
  3. 第十三章 TCP连接管理

第五章 Internet协议

ip提供了一种尽力而为、无连接的数据包交付服务。每个数据报独立于其他数据报被处理。

ipv6头部长度固定为40字节,在头部中没有可选的flag,ipv6和ipv4中只有起始4bit是相同含义 版本号。同时ipv6头部没有校验和字段,虽然ipv6头部错误会导致错误的交付,但是目前的环境下,几乎不会发生位错误,所以将校验的任务交给了上层协议。

第十二章 TCP:传输控制协议(初步)

ARQ和重传

直接处理分组丢失或者比特查错的方法:一直重发直到本分组被正常接收

  • 接收方是否接收到了分组?
  • 接收方接收到的是不是和发送方发送的一样?

ACK

  • 发送方应该等待一个ACK多长时间?
  • ACK丢失了怎么办?
  • 分组被接收到了,但是有错怎么办?

允许多个分组同时进入网络而不是发送一次确认一次存在的问题

  • 什么时候注入一个分组?
  • 注入多少个分组?
  • 等待ACK的时候如何维持计数器?保存未被确认的分组防止重传
  • 需要能够区分出哪些分组收到了哪些没有收到,而且能够组装乱序的分组
  • 如果接收方的接收速度慢怎么办?

滑动窗口 解决了上面的问题

发送方

  • 记录着哪些分组可以被释放
  • 哪些分组已经发送正在等待ACK
  • 哪些分组还待发送

接收方

  • 哪些分组已经被接收和确认
  • 哪些分组是下一步期待的

变量窗口:流量控制和拥塞控制 解决了窗口大小确定和接收方接收不过来的问题

流量控制 接收方跟不上的时候通过此迫使发送方慢下来

窗口通告(窗口更新):跟ACK在一次 调整窗口大小

拥塞控制:流量控制应对的是接收端和发送端问题,拥塞控制则是之间的网络问题

TCP不会自动插入记录标志或者消息边界,不会解读字节流中的内容,对于内容的解读交给了端点的应用程序。

TCP的包头没有包长度字段,而UDP却有

SYN会消耗一个序列号 尽管没有包体 由于消耗了序列号,丢失会被重传

ACK则不会消耗序列号

TCP可以被描述为带累计正向确认的滑动窗口协议

源端口 目的端口 源IP 目的IP唯一的标识了一条连接。(相对传统使用UID来标识的协议,这里使用了四个字段才进行标识)

第十三章 TCP连接管理

三次握手不仅让通信双方了解到了

  • 一个连接正在建立
  • 利用数据包的选项传递特殊的信息
  • 交换初始序列号,端口号

第三次握手丢失后

被动连接方在超时后会重发SYN+ACK,如果超过指定次数没有回应 则关闭连接

主动连接方connect会在第二次握手成功后状态就转变为established,这时如果向被动连接方发送数据会导致RST

四次挥手连接关闭

  • 主动关闭方,希望对方看到自己当前的seq,以及FIN包还会包含对对方最近一次数据的ACK
  • 被动方的上层应用程序会被告知连接另一端提出了关闭连接的请求。
  • 如果FIN丢失,发送方会重新传输直到收到确认的ACK

shutdown和close的区别

  • close会立刻关闭此文件描述符, 无法再读写文件描述符
  • shutdown还能根据传入的参数,一般是关闭写,这样还能继续读取残留的数据。
  • 多进程共享文件描述符的时候,close只会影响本进程,而shutdown会影响全部进程