Kirby [네트워크] Day 3
Dev/CS

[네트워크] Day 3

ragabys 2023. 11. 14.

서버 접속

서버 접속 동작의 첫 번째는 통신 상대와의 사이에 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고

데이터 송수신이 가능한 상태로 만드는 것이다.

구체적인 예로는 클라이언트의 IP 주소나 포트 번호를 서버 측에 알리는 것이 해당된다.

 

 

제어 정보는 크게 두 가지로 나뉘어진다. 하나는 클라이언트와 서버가 통신을 절충하기 위해 주고 받는 제어 정보이고,

다른 하나는 프로토콜 스택의 동작을 제어하기 위한 정보이다.

 

클라이언트와 서버가 연락을 절충하기 위해 주고받는 제어 정보는 접속 동작 뿐만 아니라 데이터를 송수신하는 동작이나,

연결을 끊는 동작도 포함하여 통신 동작 전체에서 어떤 정보가 필요한지 TCP 프로토콜의 사양으로 규정하고 있다.

이 정보는 접속, 송수신, 연결 끊기 각 단계에서 전송되는 패킷의 맨 앞부분에 추가적으로 전달되는 정보로, 이 제어정보를 헤더라고 부른다.

 

프로토콜 스택의 동작을 제어하기 위한 제어 정보에는 애플리케이션에서 통지된 정보, 통신 상대로부터 전달받은 정보 등이 기록된다.

또한 송수신 동작의 진행 상황등도 기록되어, 프로토콜 스택은 정보를 참조하여 움직이고

소켓의 제어 정보는 프로토콜 스택의 프로그램과 일체화되어 있다고 볼 수 있을 정도이다.

소켓에 기록하는 제어 정보는 프로토콜 스택을 만드는 사람에 따라 필요한 정보의 형태가 전부 달라진다.

 

 

접속의 시작은 애플리케이션이 소켓 라이브러리의 connect를 호출하면서 시작된다.

connect ( <디스크립터>, <서버 측의 IP 주소와 포트 번호>, ....)

서버 측의 IP주소와 포트 번호를 쓰면 해당 명령이 프로토콜 스택의 TCP 담당 부분으로 전달된다.

그 후 서버 TCP 담당 부분과 제어 정보를 주고 받는다.

 

제어 정보는 헤더에 담겨 있고, 그 중 중요한 것은 송신 측과 수신 측의 포트 번호이다.

이를 통해 클라이언트와 서버의 소켓을 지정할 수 있다. 

이 때 요청을 보내는 SYN(Synchronize Sequence Number)  비트를 1로 만들어 전달한다.

 

 

TCP 헤더를 만들고 나면 IP 담당 부분에 전달되고 패킷 송신 동작이 실행되어 네트워크를 통해

패킷이 서버에 도착하게 된다. 서버에 도착한 패킷은 서버측의 IP 담당 부분에서 받아 TCP 담당 부분에 건네진다.

서버는 클라이언트와 마찬가지로 송신처와 수신처의 포트 번호나 SYN 비트 등을 설정한 TCP 헤더를 만든다.

또한 응답 송신 시 ACK 컨트롤 비트 또한 1로 만들어 전달되고, 이는 서버에 패킷이 수신되었음을 전달하기 위한 동작이다.

서버로부터 송신된 응답이 클라이언트에 도달되고 나서, 클라이언트는 서버에게 패킷이 도착한 것을 알리기 위해

ACK 비트를 1로 만든 TCP 헤더를 반송한다.

 

이와 과정을 거치고 난 뒤 소켓은 데이터를 송수신할 수 있는 상태가 되고, 데이터를 송수신하는 파이프를 커넥션이라 한다.

소켓 연결이 끝난 뒤 송수신 동작이 시작된다. 송수신은 애플리케이션이 write를 호출해 송신 데이터를 프로토콜 스택에 건네 주며 시작된다.

프로토콜 스택에 건네지는 송신 데이터는 애플리케이션 마다 다르기 때문에, 버퍼 메모리 영역에 데이터를

어느 정도 저장하고 난 뒤 송수신 동작을 진행한다.

 

'어느 정도'의 기준은 한 패킷에 저장할 수 있는 데이터의 크기에 따라 결정된다.

프로토콜은 MTU(Maximum Transmission Unit)라는 매개변수를 바탕으로 판단한다.

MTU는 한 패킷으로 운반할 수 있는 디지털 데이터의 최대 길이로, 이더넷에서는 보통 1500바이트가 된다.

MTU 패킷 맨 앞에 헤더가 포함되어 있으므로 헤더를 제외한 나머지 부분이 하나의 패킷으로 전송 가능한

최대 크기가 되며, 이를 MSS(Maximum Segment Size)라 한다.

 

또한 '어느 정도'의 기준은 타이밍이기도 하다. 애플리케이션의 송신 속도가 느려지는 경우 MSS에 근접하게

데이터를 저장하면 시간이 오래 걸려 송신 동작이 지연되므로 버퍼에 데이터가 모이지 않아도 송신해야 한다.

따라서 타이머를 두고 일정 시간 이상 경과하면 패킷을 송신한다.

앞서 언급한 두 가지 기준은 서로 상반된 면이 있지만, 이에 대한 규정은 따로 없어 프로토콜 스택 개발자의 영역이다.

 

 

패킷을 송신하고 난 뒤, 송신이 제대로 이뤄졌는 지 확인 과정을 거친다.

TCP에 송신한 패킷이 올바른 송신 여부를 확인하고, 그렇지 않은 경우 재송신하는 기능이 있다.

데이터를 조각으로 분할할때 해당 조각이 통신 개시 이후 몇 번째 바이트에 해당하는 세어두고,

TCP 헤더에 시퀀스 번호라는 항목으로 저장된다.

 

패킷 전체의 길이에서 헤더 길이를 빼 데이터의 크기를 산출하고, 시퀀스 번호를 참조하면

송신한 데이터가 몇 번째 바이트부터 시작하는 몇 바이트 번째 것인지 확인할 수 있다.

 

 

수신 측에서 누락된 데이터가 없는 것이 확인되면, 데이터를 몇 번째 바이트까지 수신한 것이지 계산하고

그 값을 TCP 헤더에 ACK 번호에 기록하여 송신 측에 전달한다.

이 ACK 번호를 전달하는 것을 수신 확인 응답이라고 하며, 송신 측에서 이를 이용해 수신 진행 상황을 확인한다.

 

수신 확인 응답이 돌아오는 대기 시간 값을 타임 아웃 값이라 한다.

타임 아웃 값이 작아지면 ACK 번호가 돌아오기 전에 다시 재전송을 하여 낭비와 혼잡 악화 문제를 일으킨다.

반대로 너무 크면 패킷 전송 동작이 지연되어 심각한 속도 저하를 야기시킬 수 있다.

 

한 개의 패킷을 보내고 ACK 응답을 기다리는 낭비를 줄이기 위해 TCP는 윈도우 제어라는 방식을 사용한다.

윈도우 제어란 하나의 패킷을 보내고 ACK 응답을 기다리는 대신 연속해서 복수의 패킷을 보내는 방식으로,

수신 응답 시간을 줄여 시간 낭비를 줄이는 효과는 있다.

수신 버퍼에 데이터가 쌓이는 속도보다 패킷 도착 속도가 빠르게 되면 데이터의 손실이 발생하고,

이러한 손실을 막기 위해 수용 가능한 메모리의 크기를 TCP 헤더의 윈도우 필드에서 송신 측에 알린다.

이 때 수신 가능한 데이터 양의 최대값을 윈도우 사이즈라고 한다.

 

 

HTTP 리퀘스트 메시지 송신의 일련의 과정이 끝나고 나면, 서버에서 클라이언트로 응답 메시지를 전달한다.

서버로부터 오는 응답 메시지를 브라우저는 송신 의뢰하고, read 프로그램이 실행 된 후 프로토콜 스택의 동작이 시작된다.

프로토콜 스택은 수신한 데이터 조각과 TCP 헤더의 내용을 검사해 데이터 누락 여부 확인 후 ACK 번호를 반송한다.

그 후 수신 버퍼에 데이터를 보관하고 복원한 뒤 애플리케이션에게 원 상태의 데이터를 전달한다. 

 

 

 

 

 

Today 확인 질문

1. MTU가 뭔지 간략하게 설명해주세요.

 : MTU는  데이터 송신 과정에서 한 패킷으로 전달될 수 있는 데이터의 최대 길이를 의미합니다.

 

2.  ACK가 무엇인지, 사용되는 이유에 대해 설명해주세요.

 : ACK는 수신 확인 응답으로, 데이터의 경우 일정한 크기로 나뉘어져 송수신이 이뤄지고 해당 데이터를 패킷이라 하며,

패킷 단위의 데이터가 올바르게 수신되었음을 알리고 올바르게 수신되지 않았을 경우 패킷의 재전송을 유도하고자 사용합니다. 

 

 

References

성공과 실패를 결정하는 1%의 네트워크 원리

'Dev > CS' 카테고리의 다른 글

[네트워크] Day 5  (0) 2023.12.03
[네트워크] Day 4  (0) 2023.11.29
[네트워크] Day 2  (0) 2023.11.11
[네트워크] Day 1  (0) 2023.11.08
[운영체제] 가상 메모리, 파일 시스템  (1) 2023.10.31

댓글