{"componentChunkName":"component---src-templates-blog-post-js","path":"/Computer-Network/2020-10-13-네트워크-TCP/","result":{"data":{"site":{"siteMetadata":{"title":"Hun's Footsteps 🥷","author":"전여훈","siteUrl":"https://jeonyeohun.netlify.app","comment":{"disqusShortName":"","utterances":"jeonyeohun/jeonyeohun.github.io"},"sponsor":{"buyMeACoffeeId":"jeonyeohun"}}},"markdownRemark":{"id":"d1add2f1-b3fe-5fd9-869d-8c17a936ff39","excerpt":"참고도서: 컴퓨터 네트워킹 : 하향식 접근. 7판. James F. Kurose , Keith W.Ross 지음 TCP 연결 TCP는 항상 연결 전에 핸드쉐이킹 과정을 거치지 때문에  서비스이다. TCP로 연결된 두 프로세스는 서로 양방향으로 데이터를 주고받을 수 있다. 따라서 TCP연결은  서비스라고 하기도 한다. TCP 연결은 항상 두 프로세스 사이의 단일한 연결로 이루어지고, 다른 프로세스들은 이 연결에 포함될 수 없다. 따라서 TCP 연결은 송신자와 수신자 사이의  연결이다. TCP…","html":"<p><em><strong>참고도서: 컴퓨터 네트워킹 : 하향식 접근. 7판. James F. Kurose , Keith W.Ross 지음</strong></em></p>\n<h2 id=\"tcp-연결\" style=\"position:relative;\"><a href=\"#tcp-%EC%97%B0%EA%B2%B0\" aria-label=\"tcp 연결 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TCP 연결</h2>\n<ul>\n<li>TCP는 항상 연결 전에 핸드쉐이킹 과정을 거치지 때문에 <code class=\"language-text\">연결지향형(Connection-oriented)</code> 서비스이다.</li>\n<li>TCP로 연결된 두 프로세스는 서로 양방향으로 데이터를 주고받을 수 있다. 따라서 TCP연결은 <code class=\"language-text\">전이중(full-duplex)</code> 서비스라고 하기도 한다.</li>\n<li>TCP 연결은 항상 두 프로세스 사이의 단일한 연결로 이루어지고, 다른 프로세스들은 이 연결에 포함될 수 없다. 따라서 TCP 연결은 송신자와 수신자 사이의 <code class=\"language-text\">점대점(point-to-point)</code> 연결이다.</li>\n<li>\n<p>TCP 연결은 <code class=\"language-text\">3-way handshake</code> 로 이루어진다.</p>\n<ul>\n<li>클라이언트가 페이로드(어플리케이션 계층 데이터)가 들어있지 않은 패킷을 먼저 보낸다.</li>\n<li>송신자는 해당 패킷을 받고 다시 송신자에게 페이로드가 없는 패킷을 응답으로 보낸다.</li>\n<li>클라이언트는 송신자가 보내는 패킷을 받고 다시 한 번 패킷을 보내는데, 이때 보내는 패킷에는 페이로드가 포함될 수 있다.</li>\n</ul>\n</li>\n<li>클라이언트 프로세스는 <code class=\"language-text\">TCP의 전송 버퍼(send buffer)</code>에 전송할 데이터를 저장하게 되는데, 프로세스가 직접 데이터를 버퍼에 넣는 것이 아니라 소켓을 거쳐서 저장한다.</li>\n<li>TCP가 전송할 수 있는 세그먼트의 크기를 <code class=\"language-text\">Maximum Segment Size(MSS)</code> 라고 하는데, 이 최대 크기는 TCP 세그먼트의 전체 크기를 의미하는 것이 아니라 <code class=\"language-text\">payload의 크기</code>를 의미한다.</li>\n<li>TCP는 <code class=\"language-text\">ARQ(Automatic Repeat Request)</code>를 지원하기 때문에 패킷이 항상 순서에 맞추어서 도착하고 <code class=\"language-text\">Byte Stream</code>을 통해 바이트 단위로 전달되므로 메세지에 국한되지 않고(<code class=\"language-text\">No message boundaries</code>) 비교적 자유롭게 데이터를 송신한다.</li>\n</ul>\n<h2 id=\"tcp-세그먼트의-구조\" style=\"position:relative;\"><a href=\"#tcp-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%EC%9D%98-%EA%B5%AC%EC%A1%B0\" aria-label=\"tcp 세그먼트의 구조 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TCP 세그먼트의 구조</h2>\n<p><img src=\"https://www.myreadingroom.co.in/images/stories/docs/dcn/tcp%20segment.JPG\" alt=\"TCP-segment-structure\"></p>\n<ul>\n<li>TCP 세그먼트는 크게 헤더와 데이터로 구분된다.</li>\n<li>\n<p>TCP 세그먼트의 헤더에 포함되는 값들은 다음과 같은 목적을 가진다.</p>\n<ul>\n<li><code class=\"language-text\">출발지 포트번호, 목적지 포트번호</code> : 상위 계층 어플리케이션으로부터 다중화와 역다중화를 수행하기 위해 사용된다.</li>\n<li><code class=\"language-text\">순서번호(Sequence number), 확인응답번호(Acknowledge number)</code> : ARQ를 사용하기 위해 사용된다.</li>\n<li><code class=\"language-text\">수신 윈도우(Recieve window)</code> : Flow Control에 사용된다. 수신자가 받으려는 바이트의 크기를 나타내는데 사용된다.</li>\n<li><code class=\"language-text\">헤더길이(Header length)</code> : TCP 헤더의 길이를 나타내기 위해 사용된다.</li>\n<li><code class=\"language-text\">옵션(Option)</code> : 기타 다른 기능들을 지원하기 위해 사용된다.</li>\n<li><code class=\"language-text\">패딩(Padding)</code> : 일반적으로 헤더 길이가 4의 배수가 되어야 하는데, 옵션과 같은 가변적인 요소들 때문에 4의 배수가 안된다면, padding 에 쓰레기 값들을 넣어서 길이를 4의 배수로 맞춘다.</li>\n<li><code class=\"language-text\">플래그(Flag)</code> : 6개의 상태를 나타내기 위해 사용된다.</li>\n<li><code class=\"language-text\">URG</code>: 이 비트가 1이 되면, 해당 세그먼트는 상위 계층에 의해 ‘긴급’ 으로 설정된 세그먼트라는 것을 의미한다.</li>\n<li><code class=\"language-text\">ACK</code> : 이 비트가 1이 되면, 해당 세그먼트의 확인 응답 팔드의 값이 유효하다는 것을 의미한다.</li>\n<li><code class=\"language-text\">PSH</code> : 이 비트가 1이 되면, 해당 세그먼트는 목적지에 도착하자마자 곧바로 상위 계층에 전달해야하는 세그먼트라는 것을 의미한다.</li>\n<li><code class=\"language-text\">RST</code>, <code class=\"language-text\">SYN</code>, <code class=\"language-text\">FIN</code> : 이 비트emfdms 연셜을 설정하고 해제하기 위해 사용된다.</li>\n<li><code class=\"language-text\">긴급 데이터 포인터(Urgent data pointer)</code> : URG 포인터에 의해 지정된 긴급 데이터의 마지막 바이트 위치를 가르킨다.</li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"[네트워크] 연결지향형 트랜스포트: TCP","date":"October 13, 2020"}}},"pageContext":{"slug":"/Computer-Network/2020-10-13-네트워크-TCP/","previous":{"fields":{"slug":"/Computer-Network/2020-10-13-네트워크-트랜스포트계층/"},"frontmatter":{"title":"[네트워크] 트랜스포트 계층","category":"Computer-Network","draft":false}},"next":{"fields":{"slug":"/Computer-Network/2020-10-13-네트워크-UDP/"},"frontmatter":{"title":"[네트워크] 비연결형 트랜스포트 : UDP","category":"Computer-Network","draft":false}}}},"staticQueryHashes":["2486386679","3128451518"]}