哇...tcp真的好复杂

目前网络层分发了数据包到tcp端,tcp的handlepacket把数据存到一个队列中并提醒事件驱动机制来取数据
取到数据后先进行一个解析 确认他是一个SYN包 然后解析SYN的相关选项
对于合法的数据包 开启一个goroutine去执行三次握手的第二步:返回确认包 TODO 返回确认包的实现
This commit is contained in:
impact-eintr
2022-12-06 18:02:18 +08:00
parent 5aa21b7820
commit 5ca7a1858b
10 changed files with 654 additions and 24 deletions

View File

@@ -1,6 +1,7 @@
package tcp
import (
"fmt"
"log"
"netstack/tcpip/buffer"
"netstack/tcpip/header"
@@ -48,7 +49,7 @@ func flagString(flags uint8) string {
// segment 表示一个 TCP 段。它保存有效负载和解析的 TCP 段信息,并且可以添加到侵入列表中
type segment struct {
segmentEntry
refCnt int32
refCnt int32 // 引用计数
id stack.TransportEndpointID
route stack.Route
data buffer.VectorisedView
@@ -72,6 +73,36 @@ func newSegment(r *stack.Route, id stack.TransportEndpointID, vv buffer.Vectoris
return s
}
func newSegmentFromView(r *stack.Route, id stack.TransportEndpointID, v buffer.View) *segment {
s := &segment{
refCnt: 1,
id: id,
route: r.Clone(),
}
s.views[0] = v
s.data = buffer.NewVectorisedView(len(v), s.views[:1]) // TODO 为什么只复制1?
return s
}
func (s *segment) clone() *segment {
t := &segment{
refCnt: 1,
id: s.id,
sequenceNumber: s.sequenceNumber,
ackNumber: s.ackNumber,
flags: s.flags,
window: s.window,
route: s.route.Clone(),
viewToDeliver: s.viewToDeliver,
}
t.data = s.data.Clone(t.views[:])
return t
}
func (s *segment) flagIsSet(flag uint8) bool {
return (s.flags & flag) != 0
}
func (s *segment) decRef() {
if atomic.AddInt32(&s.refCnt, -1) == 0 {
s.route.Release()
@@ -83,14 +114,17 @@ func (s *segment) incRef() {
}
func (s *segment) parse() bool {
log.Println(header.TCP(s.data.First()))
h := header.TCP(s.data.First())
offset := int(h.DataOffset())
if offset < header.TCPMinimumSize || offset > len(h) {
return false
}
s.options = h.Options()
//s.parsedOptions = header.ParseTCPOptions(s.options)
s.parsedOptions = header.ParseTCPOptions(s.options)
log.Println(h)
fmt.Println(s.parsedOptions)
s.data.TrimFront(offset)
s.sequenceNumber = seqnum.Value(h.SequenceNumber())