본문 바로가기
항해99/CS

[항해 99] TCP

by lucian 2022. 8. 11.

우리가 사용하는 인터넷 통신을 세부적으로 보면 OSI 7 Layer로 총 7계층으로 나눠지면서 통신하다.
(왜 이렇게 하느냐면 계층을 나눠 통신이 일어나는 과정을 단계별로 파악할 수 있고 어느 곳이 문제인지를 쉽게 판단할 수 있기 때문이다.)
 그래서 각 계층마다 맡은 역할이 존재하고 이 계층마다 존재하는 프로토콜이 존재한다. 예를 들어 HTTP는 7계층 중 상위 계층인 application Layer에 존재하는 프로토콜이다. 데이터를 어떤 형태로 어떻게 보내고 받을지를 정하는 프로토콜이다.

또한 TCP란 프로토콜도 존재한다. 전송계층(Transport Layer)에 존재하는 프로토콜로 그 밑의 하위 계층인 네트워크 계층(Network Layer)의 불안전함을 보완해주는 프로토콜이다. 이 TCP에 대해 알아보고자 한다.

출처 : https://shlee0882.tistory.com/110

TCP란?

  •  Transmission Control Protocal 의 약자로 전송계층(Transport Layer)에서의 통신규약(Protocol)이다.
  •  서버와 클라이언트 간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.
  • 상위 계층에서 오는 데이터는 헤더를 붙여와서 크기가 방대해지는데, Transport 하위 계층인 Network 계층에서 이 데이터를 패킷으로 쪼개 원하고자 하는 목적지(IP 도착 주소)로 간다. 이 쪼개진 패킷은 글로벌 상에서 다양한 경로를 통해 수신자에게 도착한다.
  • 하지만 Network 계층은 이 패킷이 잘 갔는지를 보장해주지 않고 중간과정에서 내가 보낸 패킷하나가 사라질 수도 있기 때문에, 통신에 대한 문제점을 보완하고 신뢰성을 높이고자 전송계층(Transport Layer)단에서 관리해준다.
  •  또한 수신과 송신하는 컴퓨터들의 CPU, 네트워크 대역폭이 다 다르므로 속도의 차이가 날 수도 있는데, 이를 TCP가 데이터의 양을 제어하는 흐름 제어 메커니즘으로 관리를 해준다.
    (예를 들자면, 나 혼자 컵에 있는 콜라을 빨대로 마시고 있다.근데 옆 친구가 내 컵에 콜라를 들이 붙고 있으면 내가 마시는 양에 비해 콜라가 너무 많이 들어오므로 컵에 있는 콜라가 넘쳐 흘러내려 넘친 콜라는 못마시게 된다. 이처럼 수신자가 데이터를 너무 많이 보내 송신자가 감당하지 못한 만큼 보내면 패킷을 임시보관하고 있는 파이프에서 더이상 채울 수 없기에 버려지게 되는데 이를 방지하기 위해 흐름제어 메커니즘으로 관리를 해준다.)
  • TCP는 혼잡제어도 가지고 있는데, 네트워크 상에서 어느 한 라우터(교차로)에 데이터가 몰릴 경우 수신 측은 그 데이터(패킷)을 받지 못해 또 전송해달라고 요청한다. 그러면 송신측은 또 패킷을 보내게 되고 이 혼잡한 라우터에 패킷이 추가되므로 혼란만 가중시킨다. 이를 피하기 위해 데이터의 전송속도를 줄인다. 이를 혼잡제어라 한다.
  • 네트워크 상에서 패킷의 지연과 같은 오류는 항상 가능성을 열어두어야 한다. 그렇기에 TCP에선 신뢰성을 유지하기 위해 오류에 대한 컨트롤이 중요한데 이를 오류 제어라 한다.  
  • TCP는 신뢰성 있는 연결지향성 서비스를 보장하기 위해 3 way handshake / 4 way handshake 방식을 이용해서 신뢰성 있는 연결을 해준다. 여기서 연결지향성이란 상대방이 내 신호를 받을 수 있는지 없는지를 확인하고 전송을 한다는 뜻이다. 이 신호를 받을 수 있는지 없는지 확인하기 위해 3 way handshake 방식을 사용한다.

 

3 way handshake - 연결 

출처 : https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3-Way-Handshake4-Way-Handshake

  1. 클라이언트가 서버하고 연결하기 위해 SYN를 보낸다.(그안에 seq=x)
    SYN : Synchronization의 줄임말로 연결(동기화)를 위해 seq값을 보낸다. 
    (여기서 seq는 Sequence Number로 랜덤값을 부여해서 서버단에 보낸다.)
  2. 서버는 SYN(seq=x)이란 연결요청을 수락했다는 것을 클라이언트에 알려주기 위해 너가 보낸 SYN(x)에 1을 추가하여 ACK(x+1)이란 이름으로 보내주고 너의 포트도 오픈해줘란 요청을 위해 SYN(seq=y)값을 같이 보내준다.
    ACK : Acknowledgement의 줄임말로 요청에 대한 응답으로 seq+1을 해서 보낸다.
  3. 클라이언트는 서버의 SYN(seq=y)에 +1을 해서 ACK(y+1)이란 이름으로 요청을 수락한다.

이제 각자 보낸 x와 y 값으로 누구한테 받은 것인지를 알 수 있다.

seq=x이면 클라이언트가 보낸 것이구나, seq=y이면 서버가 보낸 것이구나라는 상호 연결이 된다.

 


 

이제 클라이언트와 서버는 자유롭게 데이터를 송수신받을 수 있다. 이렇게 데이터를 송수신을 완료하고 연결을 종료하고자 할 때, 4 way handshake 방식으로 연결을 끊는다.

 


4 way handshake - 연결 해제

출처 : https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3-Way-Handshake4-Way-Handshake

  1. 클라이언트가 close()메서드를 호출하면 FIN(ACK포함해서) 플래그를 서버단으로 보낸다.
    FIN : Finish의 줄임말로 종료를 요청한다.
  2. 서버는 이 FIN플래그를 받으면 받았다는 증표로 ACK를 클라이언트에게 보낸다. 그
  3. 그 후 자신도 종료의 준비(보낼 데이터가 남아있따면 마저 전송을 하고 close()메서드를 호출)이 되면 FIN(ACK)플래그를 클라이언트에게 보낸다. 
  4. 클라이언트는 FIN을 받았으므로 FIN에 대한 응답으로 ACK를 서버에 보낸다.
    - 서버는 ACK를 받으면 연결을 닫는다.
    - 클라이언트는 ACK를 보내자마자 종료하지 않고 Time_wait mode가 되어 지정한 시간이 끝나면 연결을 닫는다.

 

왜 연결과 연결종료가 3way, 4way로 차이가 날까? 

 - 클라이언트가 필요한 데이터 요청을 다 끝냈다 하더라도 서버에서는 보낼 데이터가 남아있을 수가 있다. 그렇기에 '연결 종료 할 건데 보낼 데이터 더 있니?' 란 뜻의 FIN플래그를 보내 간을 보는 것이 추가된 것이다.

 

 


 

흐름 제어 

앞서 말한 예시를 다시 보자면 내가(수신자) 콜라(패킷)을 마시는데 친구(송신자)가 마시는 양보다 많이 따라주면 컵에서 콜라가 흘러넘치게 된다(overflow). 그럼 결국 넘쳐난 콜라만큼 마시지 못하게 된다. 이처럼 송신자가 받는 속도보다 수신자가 보내는 속도가 빠르면 데이터를 저장할 수 있는 저장 용량이 초과되어 패킷 손실이 일어날 수 있다. 이를 방지하고자 TCP는 다양한 흐름제어 메카니즘을 가지고 있다. 이 중 가장 대표적인 2가지를 소개한다.

  • Stop and Wait 기법
    - 송신 측이 패킷을 전송할 때마다 응답을 받아야지만 다음 패킷을 보내주는 방식이다. 하지만 패킷 보낼 때마다 응답을 받아야하기 때문에 매우 비효율적이다. 

출처 : https://steady-coding.tistory.com/507

  • Sliding Window 기법
    - 수신 측에서 3 way handshake를 할 때 보낸 윈도우의 크기만큼 패킷을 전송하는 방식. 이후 응답이 오면 윈도우를 옆으로 옮기면서 패킷을 보낸다.
    - 1. 밑의 그림을 참고하면 수신자는 연결을 할 때(3 way handshake) 최초로 윈도우 사이즈를 7로 정한다.
    - 2. 송신자는 수신자에게 윈도우 사이즈 만큼의 패킷을 보낸다.(여기선 총 7개)
    - 3. 수신자는 자신이 받고 처리한 패킷의 수만큼 윈도우를 옆으로 옮겨 준다. 그 후 옆으로 옮긴 윈도우의 제일 앞단 위치를 ACK와 함께 송신자에게 보낸다.
    - 4. 이를 계속 반복한다. 

출처 : https://steady-coding.tistory.com/507

 


 

혼잡 제어

네트워크 상에서 어느 한 라우터(교차로)에 데이터가 몰릴 경우 수신 측은 그 데이터(패킷)을 받지 못해 또 전송해달라고 요청한다. 그러면 송신측은 또 패킷을 보내게 되고 이 혼잡한 라우터에 패킷이 추가되므로 혼란만 가중시킨다. 이를 피하기 위해 데이터의 전송속도를 줄인다. 이를 혼잡제어라 한다.

TCP는 이 혼잡 제어를 하기 위해 AIMD와 Slow Start 기법, 이 두개를 혼합하는 방식 등 다양한 기법들이 있다. 그 중 가장 대표적인 AIMD와 Slow Start기법을 소개한다.

  • AIMD(Additive Increase/ Multicative Decrease)
    - 합 증가/ 곱 감소 방식 으로 패킷을 하나씩 보내 문제가 없으면 윈도우의 크기를 1씩 증가시키면서 전송한다. 만약 전송 실패라면 윈도우의 크기를 1/2씩 줄인다. 이 방식은 윈도우가 선형적으로 증가하기 때문에 속도를 낼려면 꽤 오랜 시간이 걸린다.

출처 : https://steady-coding.tistory.com/507

  • Slow Start
    - 윈도우의 크기를 지수적으로 증가시키다가 혼잡이 감지되면 1로 줄어드는 방식이다.
    - 이 방식은 AIMD보다 속도 면에서 월등하다. 지수곱으로 커지기 때문에 속도가 엄청 빠르게 증가한다는 장점을 가지고 있다.

오류 제어

네트워크 상에 어떤 알 수 없는 이유(거대한 글로벌 웹상이므로 확인이 거의 불가능함)으로 빠르게 오류를 캐치하고 오류에 대한 응답을 하는 것을 오류 제어라고 한다. TCP는 오류가 발생하는 것을 방지하기 보다는 오류가 발생하면 다시 데이터를 재전송하는 재전송 기반 오류 제어 ARQ(Automatic Repeat Request)를 사용한다.

  • 오류를 캐치하는 방법
    - 패킷 전송 후 정해진 시간 만큼 응답(ACK)가 안왔을 경우
    - 중복된 응답(ACK)를 받은 경우
    - 수신 측에서 부정응답(NACK)를 보낸 경우
    - 중복된 응답(ACK)를 받은 경우

출처 : https://benlee73.tistory.com/186

  • Stop and Wait
    - ACK를 받고 나서 다음 데이터를 보내는 방식.
    - 일정 시간이 지나 timeout이 발생하면 이전 데이터를 재전송한다.
  • Go Back N
    - 패킷을 연속적으로 보내다가 오류가 발생한 지점부터 재전송하는 방식.
    - 1,2,3,5,6의 패킷이 성공적으로 전송됬는데 4번 패킷이 실패한 경우 4,5,6 패킷을 재전송함.
  • Selective Repeat
    - 오류가 발생한 패킷만 재전송하는 방식.
    - 수신 측에서 받는 데이터가 순차적이지 않다는 것이 단점이라 정렬에 필요한 공간이 별도로 필요하다.

 

 

 

 

 


출처 :
https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3-Way-Handshake4-Way-Handshake

 

[네트워크] TCP/UDP와 3 -Way Handshake & 4 -Way Handshake

TCP / UDP / 3-Way Handshake / 4-Way Handshake

velog.io

 

https://ciscoking.tistory.com/31

 

[네트워크] TCP(Transmission Control Protocol)에 대한 정리

TCP 의 약자가 무엇인가? Transmission Control Protocol- 전송 제어 프로토콜 TCP와 UDP의 공통점과 차이점은? 공통점으로는 포트번호를 이용해 주소를 지정한다는 점과, 데이터 오류검사를 위한 체크섬이

ciscoking.tistory.com

https://steady-coding.tistory.com/507

 

[네트워크] TCP/IP 흐름 제어 & 혼잡 제어

cs-study에서 스터디를 진행하고 있습니다. 흐름 제어 수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제가 없지만, 송신 측의 속도가 빠를 경우 문제가 생긴다. 수신 측에서 제한된 저장 용

steady-coding.tistory.com

https://benlee73.tistory.com/186

 

TCP 의 흐름 제어 / 오류 제어 / 혼잡 제어

TCP는 크게 3가지 제어 기능이 있다. 전송되는 데이터의 양을 조절하는 흐름 제어 데이터가 유실되거나 잘못된 데이터가 수신되었을 경우 대처하는 방법인 오류 제어 네트워크 혼잡에 대처하는

benlee73.tistory.com

 

'항해99 > CS' 카테고리의 다른 글

[항해99] 프로세서는 무조건 빠른 게 좋을까?  (0) 2022.07.26
[항해99] HDD vs SSD  (0) 2022.07.19

댓글