티스토리 뷰

IT/WebB

TCP의 이해

리쫑v 2016.03.25 15:10

어제 세미나에서 배운 TCP의 개념에 대해 적어둔다.


PHP에서 소켓통신을 할때 fWrite, fRead를 사용하곤 하는데.

이 보내고 받는 행위들이 어플리케이션단에서 직접 일어난다고 착각하기 쉬운데, 그렇지 않다.


내가 어플리케이션에서 fWrite를 실행하면 OS는 TCP Stack에 그 내용을 복사하고, 실제로 통신은 TCP스택에서 이루어진다고 한다.


음.. 그림을 그리면서 설명해야겠는데 콤퓨타로 그림그리는게 좀 어렵다

대충



이런그림을 그리고싶은데... 말로 설명하도록 한다.


요점은 이거다.

fWrite를 통해 한번에 두개의 패킷을 보내면

이게 전송하고 이어서 곧바로 전송되는게 아니라, 서버가 ACK를 보낼때까지 대기한 후 그게 도착하면 두번째 패킷을 보내게 된다.

만약 서버가 ACK를 안보내면 Timeout이 날때까지 기다렸다가 보내게 된다. 윈소켓에서는 보통 200ms라고 한다


이런 설계를 한 이유는. 데이터를 보낼때 오버헤드가 크기때문에 될수있는한 패킷을 보아서 전송하려는 의도가 있기 때문이다. 예전에 네트웍 속도가 느릴때는 오버헤드가 큰것을 지양했기 때문. 지금도 그건 마찬가지기는 하다.


여튼 이런 구조적인 문제때문에 발신용 소켓과 수신용 소켓을 분리해서 사용하는것은 올바른 설계가 아니라고 볼 수 있다.


그리고 이걸 막기 위해서는 TCP 옵션인 NODELAY옵션을 키면 ACK를 기다리지 않고 바로 보낸다고 한다.




또 받는 입장에서 fRead를할때 네트웍 지연으로 읽으려는 데이터가 전부 안들어왔을 경우에는, 앱단에서 다시 fRead를 해주는 번거로운 점이 있는데, 이런걸 수동으로 처리하는것이 불편하기때문에 cUrl같은 라이브러리를 사용하는것이 유리하다고 한다.

cURL의 원래이름은 seeURL인데 URL을기반으로 통신한다.. 뭐 이런뜻인 것 같다.


이상.

'IT > WebB' 카테고리의 다른 글

Javascript Scope 자바스크립트 스코프란란란?  (0) 2017.07.07
Java Generics  (0) 2017.05.25
TCP의 이해  (0) 2016.03.25
UTIL_DEBUG.NWZ  (0) 2016.01.25
HeadFirstXHTML / CSS기초 노트  (0) 2016.01.06
MSSQL SP내용 쿼리로 보기  (0) 2015.12.16
댓글
댓글쓰기 폼