π©κ°μ
μΈλΆ μλ²λ‘ HTTP μμ²μ 보λ΄λ μλΉμ€λ₯Ό μ΄μνλ€ λ³΄λ©΄ λλΆλΆμ μ€ν¨λ μ΅μν μΌκ΅΄μ λλ€. νμμμμ΄ λκ±°λ, 4xx·5xx μν μ½λκ° λμμ€κ±°λ, μλ΅ νμμ΄ λ°λμ΄ νμ±μ΄ κΉ¨μ§λλ€.
κ·Έλ°λ° μ΅κ·Ό μλ¬ λ‘κ·Έμμ μν μ½λμ‘°μ°¨ μλ, μ²μ 보λ μλ¬λ₯Ό λ§λ¬μ΅λλ€.
The response ended prematurely. (ResponseEnded)
“μλ΅μ΄ μ‘°κΈ°μ μ’ λ£λμλ€”λ λ»μΈλ°, νμμμλ μλκ³ μλ²κ° μλ¬λ₯Ό μλ΅ν κ²λ μλλλ€.
κ·Έλμ μ΄λ² κΈμμλ μ΄ μλ¬κ° HTTP μμ²μ μ΄λ λ¨κ³μμ, μ΄λ€ λ°©μμΌλ‘ λμ΄μ‘λ€λ λ»μΈμ§, κ·Έλ¦¬κ³ μ νν POST μμ²μμ λλ¬λ¬λμ§ μ 리ν΄λ³΄κ² μ΅λλ€. μλ¬ λ©μμ§λ .NET(HttpClient)μ κ²μ΄μ§λ§, λ΄μ©μ λλΆλΆμ TCP·HTTP μ΄μΌκΈ°λΌ λ€λ₯Έ μΈμ΄λ₯Ό μ°μλ λΆλ€κ»λ λμμ΄ λ κ² κ°μ΅λλ€.
1οΈβ£ HTTPS μμ² ν λ²μ΄ κ±°μΉλ λ¨κ³
μλ¬λ₯Ό μ΄ν΄νλ €λ©΄ λ¨Όμ μμ² ν λ²μ΄ μ΄λ€ λ¨κ³λ₯Ό κ±°μΉλμ§ μμμΌ ν©λλ€. https:// λ‘ μμνλ μ£Όμμ μμ²μ 보λ΄λ©΄ ν΄λΌμ΄μΈνΈλ λ€μ μμλ‘ μΌμ ν©λλ€.

HTTP μν μ½λλ 5λ¨κ³μμ μλ΅μ 첫 μ€(μν λΌμΈ)μ λ°μμΌλ§ μ μ μμ΅λλ€. κ·Έ μ μ λ¬Έμ κ° μκΈ°λ©΄ μν μ½λλ μ‘΄μ¬νμ§ μκ³ , λμ “μ΄λ λ¨κ³μμ μ€ν¨νλκ°”κ° μλ¬μ μ μ²΄κ° λ©λλ€.
.NET 8λΆν°λ μ΄ κ΅¬λΆμ HttpRequestError λΌλ μ΄κ±°νμΌλ‘ μ 곡ν©λλ€. 곡μ λ¬Έμμ μ μλ κ° μ€ μΌλΆλ₯Ό λ¨κ³μ λ§μΆ° 보면 λ€μκ³Ό κ°μ΅λλ€.
| λ¨κ³ | HttpRequestError | 곡μ λ¬Έμμ μ€λͺ |
| 1. DNS | NameResolutionError (1) | DNS μ΄λ¦ νμΈμ μ€ν¨ |
| 2. TCP | ConnectionError (2) | μ격 μλν¬μΈνΈμ μ°κ²°νλ λμ μ μ‘ μμ€ μ€λ₯ λ°μ |
| 3. TLS | SecureConnectionError (3) | TLS νΈλμ °μ΄ν¬ μ€ μ€λ₯ λ°μ |
| 5. μλ΅ | InvalidResponse (9) | μ ν¨νμ§ μκ±°λ νμμ΄ μλͺ»λ μλ΅μ μμ |
| 5. μλ΅ | ResponseEnded (10) | μλ΅μ΄ μ‘°κΈ°μ μ’ λ£λ¨ |
μ΄λ²μ λ§λ μλ¬λ ResponseEnded, μ¦ 1~4λ¨κ³λ λͺ¨λ μ§λκ³ 5λ¨κ³ μλ΅ μμ μμ μΌμ΄λ μΌμ λλ€.
2οΈβ£ λ‘κ·Έμ μλ¬μ μλ―Έ
2-1. λ‘κ·Έ
μΈλΆ μ¬μ΄νΈμ μ‘°ν μμ²(POST)μ 보λ΄λ€κ° λ°μνμ΅λλ€. μμΈ μ²΄μΈμμ ν΅μ¬λ§ μΆλ¦¬λ©΄ λ€μκ³Ό κ°μ΅λλ€.
System.Net.Http.HttpRequestException
: An error occurred while sending the request.
---> System.Net.Http.HttpIOException
: The response ended prematurely. (ResponseEnded)
at System.Net.Http.HttpConnection.SendAsync(...)
μ΄ μμ²μ νμμμμ 6μ΄μλλ°, μ€ν¨κΉμ§ κ±Έλ¦° μκ°μ μ½ 0.6μ΄μμ΅λλ€. μ¦ νμμμμ΄ μλλλ€. κΈ°λ€λ¦¬λ€ μ§μΉ κ²μ΄ μλλΌ, κΈλ°© “λ”μ ν΅λ³΄λ°μ κ²μ λλ€.
2-2. SocketException μ΄ μλ€λ κ²μ΄ λ¨μ
μ΄ λ‘κ·Έμμ λμ λλ μ μ΄ μμ΅λλ€. λ€νΈμν¬κ° λκ²Όμ λ νν λ°λΌμ€λ SocketException μ΄ μμΈ μ²΄μΈ μ΄λμλ μμ΅λλ€. μμΌ κ³μΈ΅μμλ μ무 μλ¬λ λμ§ μμλ€λ λ»μ λλ€.
.NET λ°νμ μμ€(HttpConnection.cs)μμ μ΄ μμΈλ₯Ό λμ§λ κ³³μ 보면 μ΄μ λ₯Ό μ μ μμ΅λλ€. μλ΅μ μ½μΌλ €κ³ μμΌμμ read λ₯Ό νλλ° μ½μ λ°μ΄νΈ μκ° 0μ΄λ©΄ μ΄ μμΈλ₯Ό λμ§λλ€.
// dotnet/runtime (v8.0.0) HttpConnection.cs μμ λ°μ·
if (bytesRead == 0)
{
throw new HttpIOException(HttpRequestError.ResponseEnded, SR.net_http_invalid_response_premature_eof);
}
μμΌμμ 0λ°μ΄νΈ μ½κΈ°λ μλ¬κ° μλλΌ EOF, μ¦ μλκ° FIN μΌλ‘ μ°κ²°μ μ μ μ’ λ£νλ€λ μ νΈμ λλ€. TCP μ μ₯μμλ μ무 λ¬Έμ μλ κΉλν μ’ λ£μ λλ€. νμ§λ§ HTTP μ μ₯μμλ μμ²μ 보λλλ° μλ΅μ΄ μμ±λκΈ° μ μ μ€νΈλ¦Όμ΄ λλ¬μΌλ λΉμ μμ λλ€.
TCP μ°κ²°μ΄ λλλ λ°©μμ λ κ°μ§μΈλ°, λ°λ μͺ½μμ 보μ΄λ λͺ¨μ΅μ΄ μλ‘ λ€λ¦ λλ€.

μ΄λ² λ‘κ·Έλ FIN μͺ½μ λλ€. λ°λλ‘ RST λ‘ λκΈ°λ©΄ SocketException μ΄ μμΈ μ²΄μΈμ λνλλλ°, μ΄ μ°¨μ΄λ λ€μ κΈ(The SSL connection could not be established νΈ)μμ μμΈν λ€λ£Ήλλ€.
HTTP/1.1 νμ€(RFC 9112 8μ )μ μ΄λ₯Ό λΆμμ ν λ©μμ§(incomplete message) λ‘ λ€λ£Ήλλ€. μ°κ²°μ΄ μ‘°κΈ°μ λ«ν λΆμμ ν μλ΅μ λ°μ ν΄λΌμ΄μΈνΈλ κ·Έ λ©μμ§λ₯Ό λΆμμ ν κ²μΌλ‘ κΈ°λ‘ν΄μΌ ν©λλ€. .NET μ κ·Έκ²μ ResponseEnded λΌλ μλ¬λ‘ ννν©λλ€.
μ΄ μλ¬μ μ μ²΄λ “μμ²μ 보λλλ°, μλ΅μ λ€ λ°κΈ° μ μ μλκ° μ°κ²°μ (μ μμ μΌλ‘) λ«μλ€” μ λλ€.
μ΄ μμΈλ μλ΅ λ³Έλ¬Έμ μ½λ λμ€μλ λ°μν μ μμ§λ§, μ΄λ² λ‘κ·Έμ μ€ν νΈλ μ΄μ€λ HttpConnection.SendAsync, μ¦ μλ΅μ μν λΌμΈκ³Ό ν€λλ₯Ό λ°λ ꡬκ°μ λλ€. μλ΅ ν€λλ₯Ό λ€ λ°κΈ°λ μ μ μ°κ²°μ΄ λ«ν κ²μ λλ€.
3οΈβ£ μ λ«νμκΉ
3-1. μμΈ ν보 β : Keep-Alive μ°κ²°μ κ²½μ μν
HTTP/1.1 μ κΈ°λ³Έμ μΌλ‘ μ§μ μ°κ²°(persistent connection) μ μ¬μ©ν©λλ€. μμ²λ§λ€ TCP μ°κ²°κ³Ό TLS νΈλμ °μ΄ν¬λ₯Ό μλ‘ νλ©΄ λΉμΈκΈ° λλ¬Έμ, ν λ² λ§Ίμ μ°κ²°μ λ«μ§ μκ³ λ€μ μμ²μ μ¬μ¬μ©ν©λλ€. ν΄λΌμ΄μΈνΈλ μ΄λ° μ°κ²°λ€μ 컀λ₯μ νμ 보κ΄ν©λλ€.
λ¬Έμ λ μλ²λ νκ°ν μ°κ²°μ 무νμ λ€κ³ μμ§λ μλλ€λ μ μ λλ€. RFC 9112 9.5μ μ μλ²κ° λ³΄ν΅ λΉνμ± μ°κ²°μ μ μ§νλ νμμμ κ°μ κ°μ§λ©°, ν΄λΌμ΄μΈνΈ·μλ²·νλ‘μλ μΈμ λ μ§ μ μ‘ μ°κ²°μ λ«μ μ μλ€κ³ λ§ν©λλ€.
κ·Έλ¦¬κ³ λ°λ‘ μ΄ μν©μ μλ‘ λλλ€. μλ²κ° “μ ν΄” μ°κ²°μ λ«κΈ°λ‘ κ²°μ ν κ²κ³Ό κ°μ μμ μ ν΄λΌμ΄μΈνΈκ° μ μμ²μ 보λ΄κΈ° μμν μ μλ€λ κ²μ λλ€. μλ²κ° 보기μλ μ ν΄ μνμ μ°κ²°μ λ«μ κ²μ΄μ§λ§, ν΄λΌμ΄μΈνΈκ° 보기μλ μμ²μ΄ μ§ν μ€μΈ μ°κ²°μ΄ λ«ν κ²μ΄ λ©λλ€.

.NET λ°νμ μμ€μλ ν΄λΉ μμΉμ “μλ²κ° μκΈ° μͺ½μμ μ°κ²°μ μ’ λ£νκ³ , μ ν΄ νμμμ λλ¬ΈμΌ κ°λ₯μ±μ΄ λλ€”λ μ£Όμμ΄ λ¬λ € μμ΅λλ€(λ°λ‘ μλ 3-2μ μ½λ). λ°νμ κ°λ°μλ€λ μ΄ μν©μ λνμ μΈ μμΈμΌλ‘ μ ν΄ μ°κ²° μ’ λ£λ₯Ό κΌ½κ³ μλ€λ λ»μ λλ€.
λ¬Όλ‘ .NET λ μμ λκ³ μμ§λ μμ΅λλ€. νμμ μ°κ²°μ κΊΌλΌ λ κ·Έ μ°κ²°μ΄ μ΄λ―Έ λ«νλμ§(EOF λ₯Ό λ°μλμ§) νμΈνκ³ , λ«ν μ°κ²°μ μ°μ§ μμ΅λλ€. νμ§λ§ νμΈν μ§νλΆν° μμ²μ΄ μλ²μ λμ°©νκΈ° μ μ¬μ΄μ μλ²κ° λ«μλ²λ¦¬λ κ²½μ°λ ν΄λΌμ΄μΈνΈκ° μμ²μ μΌλ‘ λ§μ μ μμ΅λλ€.
3-2. κ·ΈλΌ μλμΌλ‘ μ¬μλν΄ μ£Όλ©΄ λμ§ μλ?
μ€μ λ‘ ν΄μ€λλ€. λ¨, μ‘°κ±΄μ΄ μμ΅λλ€. μ΄λ² λ‘κ·Έμ μ€νμ μ°ν SendAsync μμ μ΄λ° λΆκΈ°κ° μμ΅λλ€.
// dotnet/runtime (v8.0.0) HttpConnection.cs (SendAsync) μμ λ°μ·
if (_readBuffer.ActiveLength == 0)
{
// The server shutdown the connection on their end, likely because of an idle timeout.
// If we haven't started sending the request body yet (or there is no request body),
// then we allow the request to be retried.
if (request.Content is null || allowExpect100ToContinue is not null)
{
_canRetry = true;
}
throw new HttpIOException(HttpRequestError.ResponseEnded, SR.net_http_invalid_response_premature_eof);
}
μλ΅μ ν λ°μ΄νΈλ λ°μ§ λͺ»ν μ± μ°κ²°μ΄ λ«νκ³ , μμ² λ³Έλ¬Έμ΄ μκ±°λ μμ§ λ³Έλ¬Έμ 보λ΄κΈ° μ μ΄λΌλ©΄ μ¬μλ κ°λ₯μΌλ‘ νμν©λλ€. κ·Έλ¬λ©΄ 컀λ₯μ νμ΄ μμΈλ₯Ό μΌν€κ³ μ μ°κ²°λ‘ μμ²μ λ€μ 보λ λλ€. νΈμΆν μͺ½μ κ·Έλ° μΌμ΄ μμλμ§λ λͺ¨λ¦ λλ€.
λ°λλ‘ λ³Έλ¬Έμ΄ μλ μμ²μ μ΄λ―Έ λ³Έλ¬Έμ 보λμ μ μμΌλ―λ‘ μ¬μλνμ§ μκ³ μμΈλ₯Ό κ·Έλλ‘ μ¬λ¦½λλ€. μ΄λ²μ μ€ν¨ν μμ²μ΄ μ νν λ³Έλ¬Έμ΄ μλ POST μμ΅λλ€. GET μμ²μμλ μ‘°μ©ν λμ΄κ°λ μν©μ΄, POST μμλ μλ¬λ‘ λλ¬λ κ²μ λλ€.

μ΄ λμμ HTTP νμ€κ³Όλ λ§λΏμ μμ΅λλ€. RFC 9110 9.2.2μ μ λ€μκ³Ό κ°μ΄ μ 리ν©λλ€.
- λ©±λ±(idempotent) λ©μλ(GET, HEAD, PUT, DELETE λ±)λ μλ΅μ μ½κΈ° μ μ ν΅μ μ₯μ κ° λλ©΄ μλμΌλ‘ λ€μ λ³΄λΌ μ μλ€.
- λ©±λ±νμ§ μμ λ©μλ(POST λ±)λ μμ²μ μλ―Έκ° μ€μ λ‘λ λ©±λ±νλ€λ κ²μ μκ±°λ, μλ μμ²μ΄ μ μ©λμ§ μμμμ νμΈν μλ¨μ΄ μλ ν μλ μ¬μλνμ§ μμμΌ νλ€(SHOULD NOT).
μ΄μ λ λ¨μν©λλ€. ν΄λΌμ΄μΈνΈλ μλ²κ° μμ²μ μ²λ¦¬νλμ§ μ μ μκΈ° λλ¬Έμ λλ€. μμ²μ΄ λμ°©νκΈ° μ μ λ«νμ μλ μκ³ , μ²λ¦¬λ₯Ό λλ΄κ³ μλ΅μ 보λ΄λ €λ€ μ£½μμ μλ μμ΅λλ€. “κ²°μ ” κ°μ μμ²μ 무ν±λκ³ λ€μ 보λ΄λ©΄ λ λ² μ²λ¦¬λ μ μμ΅λλ€.
3-3. μμΈ ν보 β‘ : μλ²κ° μμ²μ λ³΄κ³ λ«μ κ²½μ°
μ ν΄ μ°κ²° κ²½μμ΄ μ μΌν μμΈμ μλλλ€. μλ΅μ 보λ΄κΈ° μ μ μ°κ²°μ λ«λ μν©μ΄λ©΄ 무μμ΄λ κ°μ μλ¬κ° λ©λλ€.
- μλ² μ ν리μΌμ΄μ μ΄ μμ²μ μ²λ¦¬νλ€ λΉμ μ μ’ λ£λκ±°λ μ¬μμλ κ²½μ°
- μλ² μλ¨μ νλ‘μ·λ‘λλ°Έλ°μκ° λ°±μλ λ¬Έμ λ‘ μλ΅ μμ΄ μ°κ²°μ λ«μ κ²½μ°
- μλ²λ 보μ μ₯λΉκ° μμ² λ΄μ©μ λ³΄κ³ μλ΅ μμ΄ μ°κ²°μ λ«μλ²λ¦° κ²½μ°
ν΄λΌμ΄μΈνΈ μμΈλ§μΌλ‘λ μ΄ μ°κ²°μ΄ νμμ μ¬μ¬μ©λ κ²μ΄μλμ§ μ μ μμΌλ―λ‘, λ°μ ν¨ν΄μΌλ‘ ꡬλΆν©λλ€.
- κ°νμ μ΄κ³ , νλμ μμ²μ΄ μλ€κ° λ³΄λΈ μμ²μμ μ£Όλ‘ λλ€ → μ ν΄ μ°κ²° κ²½μ
- νΉμ μμ²μμ λ§€λ² λλ€ → μλ²κ° κ·Έ μμ²μ μ²λ¦¬νμ§ λͺ»νκ±°λ κ±°λΆνλ κ²
- νΉμ μκ°λμ λͺ°λ €μ λλ€ → μλ² λ°°ν¬·μ¬μμ·μ₯μ
ν΄λΉ μλ¬λ λ‘κ·Έμμ μ§κ³ν΄ λ΄€μλ λ§€μ° κ°νμ μΌλ‘ μΌμ΄λ¬κΈ° λλ¬Έμ μΌλ¨μ "μ ν΄ μ°κ²° κ²½μ"λ‘ κ²°λ‘ μ§μμ΅λλ€.
4οΈβ£ λμ λ°©λ²
β ν΄λΌμ΄μΈνΈμ μ ν΄ νμμμμ μλ²λ³΄λ€ μ§§κ²
κ²½μ μνλ “μλ²κ° λ¨Όμ λ«λ” ꡬ쑰μμ μκΉλλ€. ν΄λΌμ΄μΈνΈκ° μλ²λ³΄λ€ λ¨Όμ μ ν΄ μ°κ²°μ λ²λ¦¬λ©΄ μ°½μ΄ ν¬κ² μ€μ΄λλλ€. .NET μμλ SocketsHttpHandler μ λ μμ±μ΄ κ΄λ ¨λ©λλ€.
| μμ± | μλ―Έ | κΈ°λ³Έκ° |
| PooledConnectionIdleTimeout | μ°κ²°μ΄ νμμ μ ν΄ μνλ‘ μμ΄λ μ¬μ¬μ© κ°λ₯νλ€κ³ 보λ μ΅λ μκ° | .NET 6 μ΄μ 1λΆ (.NET Core, .NET 5 λ 2λΆ) |
| PooledConnectionLifetime | μ°κ²°μ΄ μ립λ μμ λΆν° νμμ μ¬μ¬μ© κ°λ₯νλ€κ³ 보λ μ΅λ μκ° | 무μ ν |
var handler = new SocketsHttpHandler
{
// μλ μλ²μ keep-alive νμμμλ³΄λ€ μ§§κ²
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(30),
// μ°κ²°μ μ£ΌκΈ°μ μΌλ‘ μλ‘ λ§Ίμ΄ DNS λ± λ€νΈμν¬ λ³νλ λ°μ
PooledConnectionLifetime = TimeSpan.FromMinutes(2),
};
var client = new HttpClient(handler);
μ μ«μλ μμμΌ λΏμ΄κ³ , μλ μλ²μ μ ν΄ νμμμμ λ§μΆ° μ ν΄μΌ ν©λλ€. μ°Έκ³ λ‘ PooledConnectionLifetime μ Microsoft μ HttpClient κ°μ΄λλΌμΈμμ DNS λ³κ²½μ λ°μνκΈ° μν΄ μ€μ μ κΆμ₯νλ κ°μ΄κΈ°λ ν©λλ€. HttpClient λ μ°κ²°μ λ§λ€ λλ§ DNS λ₯Ό μ‘°ννκΈ° λλ¬Έμ λλ€.
β‘ μ¬μλλ “λ€μ 보λ΄λ λλ μμ²μΈκ°”λ₯Ό νλ¨ν λ€μ
μ€μ μΌλ‘ μ°½μ μ€μ¬λ 0 μ΄ λμ§λ μμ΅λλ€. RFC 9112(9.3.1μ )λ ꡬν체λ μκ³ μλ μ°κ²° μ’ λ£λ‘λΆν° 볡ꡬν νμλ₯Ό μμν΄μΌ νλ€κ³ λ§ν©λλ€. κ²°κ΅ μ¬μλκ° νμν©λλ€.
λ°νμμ΄ POST λ₯Ό μλ μ¬μλνμ§ μλ μ΄μ λ κ·Έ μμ²μ΄ μμ νμ§ λ°νμμ λͺ¨λ₯΄κΈ° λλ¬Έμ λλ€. νμ§λ§ μ ν리μΌμ΄μ μ μλλ€. RFC 9110 λ μμ²μ΄ ν΄λΉ 리μμ€μ λν΄ μμ νλ€λ κ²μ (μ€κ³λ μ€μ μ ν΅ν΄) μκ³ μλ€λ©΄ POST λ₯Ό μλμΌλ‘ λ°λ³΅ν μ μλ€κ³ μ κ³ μμ΅λλ€.
λ©μλλ POST μ§λ§ μ€μ λ‘λ μ‘°νλ§ νλ μμ²μ΄λΌλ©΄ μ¬μλν΄λ λ©λλ€. λ°λλ‘ μνλ₯Ό λ°κΎΈλ μμ²μ΄λΌλ©΄ λ©±λ±ν€ κ°μ μ₯μΉ μμ΄λ μ¬μλνλ©΄ μ λ©λλ€.
try
{
return await client.SendAsync(request, cancellationToken);
}
catch (HttpRequestException e) when (IsResponseEnded(e) && isSafeToRetry)
{
// μ μ°κ²°λ‘ λ€μ μλ (μμ² κ°μ²΄λ μλ‘ λ§λ€μ΄μΌ ν¨)
}
static bool IsResponseEnded(HttpRequestException e) =>
e.HttpRequestError == HttpRequestError.ResponseEnded ||
e.InnerException is HttpIOException { HttpRequestError: HttpRequestError.ResponseEnded };
μλ¬ λ©μμ§ λ¬Έμμ΄μ λΉκ΅νλ λμ HttpRequestError κ°μΌλ‘ λΆκΈ°ν μ μλ€λ μ μ΄ .NET 8 μ΄νμ μ₯μ μ λλ€. μ¬μλ μ€κ³ μ체λ μ΄μ μ μ΄ κΈλ€μ μ°Έκ³ ν΄ μ£ΌμΈμ.
- λ°±μλ μμ€ν μμμ νμμμ(Timeout)μ λν μ΄ν΄μ μ€κ³ κΈ°μ€
- Timeout·Retry·Fallback μ€ν¨ μ²λ¦¬ 체κ³
- Jitter(μ§ν°)μ μ΄ν΄μ λ€μν μ€λ¬΄ νμ©λ²
5οΈβ£ κ²°κ³Ό λ° λ°°μ΄ μ
1. μν μ½λκ° μλ μλ¬λ “λ¨κ³”λ‘ λΆλ₯νλ€
- DNS, TCP, TLS, μμ², μλ΅ μ€ μ΄λμμ λκ²Όλμ§κ° κ³§ μμΈ ν보μ λ²μμ λλ€.
2. μμΈ μ²΄μΈμ 무μμ΄ “μλμ§”λ λ¨μλ€
- SocketException μ΄ μλ€λ κ²μ μμΌ μλ¬ μμ΄ 0λ°μ΄νΈ μ½κΈ°(EOF)λ‘ λλ¬λ€λ λ»μ΄κ³ , μλκ° FIN μΌλ‘ λ«μλ€λ λ»μ λλ€.
3. μ°κ²°μ μΈμ λ λκΈΈ μ μκ³ , κ·Έκ²μ νμ€μ΄ νμ©ν λμμ΄λ€
- Keep-Alive μ°κ²°μ κ²½μ μνλ λ²κ·Έκ° μλλΌ κ΅¬μ‘°μ μΌλ‘ μ‘΄μ¬νλ νμ λλ€. ν΄λΌμ΄μΈνΈλ μ΄λ₯Ό μ μ λ‘ μ€κ³ν΄μΌ ν©λλ€.
4. μ¬μλμ κΈ°μ€μ “μ€ν¨νλκ°”κ° μλλΌ “λ€μ 보λ΄λ λλκ°”λ€
- λ°νμμ΄ GET μ μ‘°μ©ν μ¬μλνκ³ λ³Έλ¬Έμ΄ μλ POST λ κ·Έλλ‘ μμΈλ₯Ό μ¬λ¦¬λ μ΄μ κ° μ¬κΈ°μ μμ΅λλ€.
5. μ°κ²° μ€μ λ§ λ³΄μ§ λ§κ³ μ€μ λ‘ λ³΄λΈ μμ²λ λ³Έλ€
- μμ²μ λ°μ λ€μ λ«νλ€λ©΄, μλκ° κ·Έ μμ²μ 무μμ λ³΄κ³ λ«μλμ§λ μμΈ ν보μ λλ€.
μ΄ κΈμ΄ λΉμ·ν μλ¬λ₯Ό μ²μ λ§λ λΆλ€μκ² λμμ΄ λμμΌλ©΄ ν©λλ€.
μ°Έκ³ μλ£
- Microsoft Learn - HttpClient guidelines for .NET
- Microsoft Learn - SocketsHttpHandler.PooledConnectionIdleTimeout
- Microsoft Learn - SocketsHttpHandler.PooledConnectionLifetime
- dotnet/runtime v8.0.0 - HttpConnection.cs
- RFC 9112 - HTTP/1.1 (8. Handling Incomplete Messages, 9.3.1 Retrying Requests, 9.5 Failures and Timeouts)
λκΈ