github 位址
fasthttp 服務端的處理請求的過程
工作過程
主要**
設定監聽位址 server.go
func (s *server) listenandserve(addr string) error
if tcpln, ok := ln.(*net.tcplistener); ok )
} return s.serve(ln)
}
初始化協程池並啟動,當接收到請求後,調 wp.serve 交給協程池去處理請求 server.go
func (s *server) serve(ln net.listener) error
wp.start()
for
s.setstate(c, statenew)
atomic.addint32(&s.open, 1)
if !wp.serve(c)
} ......
}
獲取請求的控制代碼 server.go
func acceptconn(s *server, ln net.listener, lastperiperrortime *time.time) (net.conn, error)
}
協程池處理請求 workerpool.go
// 從協程池中獲取某個協程對應的 控制代碼channel,然後將 3 中獲取到的 請求控制代碼推入channel
func (wp *workerpool) serve(c net.conn) bool
ch.ch
return true
}// 這個是協程池工作最重要的部分,獲取協程池中協程對應的channel
func (wp *workerpool) getch() *workerchan
} else
wp.lock.unlock()
if ch == nil
// 新建協程控制代碼,且為之建立協程
vch := wp.workerchanpool.get()
ch = vch.(*workerchan)
go func() ()
} return ch
}func (wp *workerpool) workerfunc(ch *workerchan)
// wp.workerfunc是在初始化協程池的時候註冊的方法,是 s.serveconn
if err = wp.workerfunc(c); err != nil && err != errhijacked
} ......
if !wp.release(ch)
} .....
// 協程的控制代碼channel 出現nil的時候 當前協程就退出了,退出後將work協程數自減
wp.workerscount--
......
}// 請求處理完之後 將當前協程的控制代碼channel 放入協程池的ready切片中,待下次獲取協程的控制代碼channel的時候進行復用(復用這個控制代碼channel就相當於復用了對應的協程)
func (wp *workerpool) release(ch *workerchan) bool
wp.lock.unlock()
return true
}
實際處理請求的方法 server.go
func (s *server) serveconn(c net.conn) (err error)
.....
// 處理http響應
}
高效的原因
fasthttp 協程池 詳情見 2.2.2 、2.2.4
fasthttp 物件復用
協程channle物件 復用 詳見2.2.4 的 getch() 函式
上下文物件復用 詳見2.2.5
SSRF(服務端請求偽造)
ssrf server side request forgery 伺服器端請求偽造 是一種由攻擊者構造形成由服務端發起請求的乙個安全漏洞。一般情況下,ssrf攻擊的目標是從外網無法訪問的內部系統。正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統 作為web安全萌新,以上晦澀...
SSRF 服務端請求偽造
ssrf,server side request forgery,服務端請求偽造,是一種由攻擊者構造形成由伺服器端發起請求的乙個漏洞。一般情況下,ssrf 攻擊的目標是從外網無法訪問的內部系統。漏洞形成的原因大多是因為服務端提供了從其他伺服器應用獲取資料的功能且沒有對目標位址作過濾和限制。也就是當前...
SSRF 服務端請求偽造
ssrf,server side request forgery,服務端請求偽造,是一種由攻擊者構造形成由伺服器端發起請求的乙個漏洞。一般情況下,ssrf 攻擊的目標是從外網無法訪問的內部系統。漏洞形成的原因大多是因為服務端提供了從其他伺服器應用獲取資料的功能且沒有對目標位址作過濾和限制。攻擊者可以...